Django知识点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
一、Django
     
    pip3 install django
     
     
    C:\Python35\Scripts
     
    # 创建Django工程
    django-admin startproject 【工程名称】
     
        mysite
            - mysite        # 对整个程序进行配置
                - init
                - settings  # 配置文件
                - url       # URL对应关系
                - wsgi      # 遵循WSIG规范,uwsgi + nginx
            - manage.py     # 管理Django程序:
                                - python manage.py
                                - python manage.py startapp xx
                                - python manage.py makemigrations
                                - python manage.py migrate
         
         
         
    # 运行Django功能
    python manage.py runserver 127.0.0.1:8001
     
     
    chouti
        - chouti
            - 配置
        - 主站 app
        - 后台管理 app
     
     
     
    # 创建app
    python manage.py startapp cmdb
    python manage.py startapp openstack
    python manage.py startapp xxoo....
     
     
    app:
        migrations     数据修改表结构
        admin          Django为我们提供的后台管理
        apps           配置当前app
        models         ORM,写指定的类  通过命令可以创建数据库结构
        tests          单元测试
        views          业务代码
     
     
     
    1、配置模板的路径
     
        TEMPLATES = [
                {
                    'BACKEND': 'django.template.backends.django.DjangoTemplates',
                    'DIRS': [os.path.join(BASE_DIR, 'templates')],
                    'APP_DIRS': True,
                    'OPTIONS': {
                        'context_processors': [
                            'django.template.context_processors.debug',
                            'django.template.context_processors.request',
                            'django.contrib.auth.context_processors.auth',
                            'django.contrib.messages.context_processors.messages',
                        ],
                    },
                },
            ]
    2、配置静态目录
        static
     
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, 'static'),
        )
 
         
        <link rel="stylesheet" href="/static/commons.css" />
     
 
内容整理
    1. 创建Django工程
            django-admin startproject 工程名
 
    2. 创建APP
        cd 工程名
        python manage.py startapp cmdb
 
    3、静态文件
        project.settings.py
         
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )
     
    4、模板路径
     
        DIRS ==>    [os.path.join(BASE_DIR,'templates'),]
         
    5、settings中
         
        middlerware
         
            # 注释 csrf
             
             
    6、定义路由规则
        url.py
         
            "login" --> 函数名
             
    7、定义视图函数
        app下views.py
             
            def func(request):
                # request.method   GET / POST
                 
                # http://127.0.0.1:8009/home?nid=123&name=alex
                # request.GET.get('',None)   # 获取请求发来的而数据
                 
                # request.POST.get('',None)
                 
                 
                # return HttpResponse("字符串")
                # return render(request, "HTML模板的路径")
                # return redirect('/只能填URL')
                 
    8、模板渲染
        特殊的模板语言
         
            -- {{ 变量名 }}
         
                def func(request):
                    return render(request, "index.html", {'current_user': "alex"})
         
                     
                index.html
                 
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                    </body>
                 
                </html>
                 
                ====> 最后生成的字符串
                 
                <html>
                ..
                    <body>
                        <div>alex</div>
                    </body>
                 
                </html>
            -- For循环
                def func(request):
                    return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']})
         
                     
                index.html
                 
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                         
                        <ul>
                            {% for row in user_list %}
                             
                                {% if row == "alex" %}
                                    <li>{{ row }}</li>
                                {% endif %}
                                 
                            {% endfor %}
                        </ul>
                         
                    </body>
                 
                </html>
                 
            #####索引#################
                def func(request):
                    return render(request, "index.html", {
                                'current_user': "alex",
                                'user_list': ['alex','eric'],
                                'user_dict': {'k1': 'v1', 'k2': 'v2'}})
         
                     
                index.html
                 
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                         
                        <a> {{ user_list.1 }} </a>
                        <a> {{ user_dict.k1 }} </a>
                        <a> {{ user_dict.k2 }} </a>
                         
                    </body>
                 
                </html>
             
            ###### 条件
             
                def func(request):
                    return render(request, "index.html", {
                                'current_user': "alex",
                                "age": 18,
                                'user_list': ['alex','eric'],
                                'user_dict': {'k1': 'v1', 'k2': 'v2'}})
         
                     
                index.html
                 
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                         
                        <a> {{ user_list.1 }} </a>
                        <a> {{ user_dict.k1 }} </a>
                        <a> {{ user_dict.k2 }} </a>
                         
                        {% if age %}
                            <a>有年龄</a>
                            {% if age > 16 %}
                                <a>老男人</a>
                            {% else %}
                                <a>小鲜肉</a>
                            {% endif %}
                        {% else %}
                            <a>无年龄</a>
                        {% endif %}
                    </body>
                 
                </html>
 
二、路由系统,URL
    1、url(r'^index/', views.index),   
       url(r'^home/', views.Home.as_view()),
    2、url(r'^detail-(\d+).html', views.detail), 
    3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
        
       PS:
            def detail(request, *args,**kwargs):
                pass
     
       实战:
            a.
                url(r'^detail-(\d+)-(\d+).html', views.detail),
                 
                def func(request, nid, uid):
                     
                    pass
             
                def func(request, *args):
                    args = (2,9)
                     
                     
                def func(request, *args, **kwargs):
                    args = (2,9)
        
            b.
                url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
                 
                def func(request, nid, uid):
                    pass
                     
                def funct(request, **kwargs):
                    kwargs = {'nid': 1, 'uid': 3}
                     
                def func(request, *args, **kwargs):
                    args = (2,9)
    4、 name
         
        对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****
         
        url(r'^asdfasdfasdf/', views.index, name='i1'),
        url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
        url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
         
         
         
        def func(request, *args, **kwargs):
            from django.urls import reverse
             
            url1 = reverse('i1')                              # asdfasdfasdf/
            url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
            url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/
         
         
        xxx.html
             
            {% url "i1" %}               # asdfasdfasdf/
            {% url "i2" 1 2 %}           # yug/1/2/
            {% url "i3" pid=1 nid=9 %}   # buy/1/9/
         
        注:
            # 当前的URL
            request.path_info
    5、多级路由
         
        project/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin
 
            urlpatterns = [
                url(r'^cmdb/', include("app01.urls")),
                url(r'^monitor/', include("app02.urls")),
            ]
             
        app01/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin
            from app01 import views
 
            urlpatterns = [
                url(r'^login/', views.login),
            ]
             
        app02/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin
            from app02 import views
 
            urlpatterns = [
                url(r'^login/', views.login),
            ]
     
    6、默认值(欠)
     
    7、命名空间(欠)
     
     
二、视图
    1、获取用户请求数据
        request.GET
        request.POST
        request.FILES
        PS:
            GET:获取数据               
            POST:提交数据
             
    2、checkbox等多选的内容
        request.POST.getlist()
    3、上传文件
        # 上传文件,form标签做特殊设置
        obj = request.FILES.get('fafafa')
        obj.name
        f = open(obj.name, mode='wb')
        for item in obj.chunks():
            f.write(item)
        f.close()
     
    4、FBV & CBV
       function base view
        
        url.py
            index -> 函数名
             
        view.py
            def 函数(request):
                ...
        ====
        /index/ -> 函数名
             
        /index/ -> 类
         
        ====
         
        建议:两者都用
         
    5、装饰器
        
 
     
三、模板
     
     
 
四、ORM操作
    select * from tb where id > 1
    # 对应关系
    models.tb.objects.filter(id__gt=1)
    models.tb.objects.filter(id=1)
    models.tb.objects.filter(id__lt=1)
     
    创建类
     
    a. 先写类
        from django.db import models
 
        # app01_userinfo
        class UserInfo(models.Model):
            # id列,自增,主键
            # 用户名列,字符串类型,指定长度
            username = models.CharField(max_length=32)
            password = models.CharField(max_length=64)
         
    b. 注册APP
 
        INSTALLED_APPS = [
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            'app01',
        ]
    c. 执行命令
        python manage.py  makemigrations
        python manage.py  migrate
         
    d. ********** 注意 ***********
        Django默认使用MySQLdb模块链接MySQL
        主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
            import pymysql
            pymysql.install_as_MySQLdb()
     
    1. 根据类自动创建数据库表
        # app下的models.py
     
        python manage.py  makemigrations
        python manage.py  migrate
         
         
        字段:
            字符串类型
             
             
            数字
             
             
            时间
             
             
            二进制
             
            自增(primary_key=True
             
        字段的参数:
            null               -> db是否可以为空
            default            -> 默认值
            primary_key        -> 主键
            db_column          -> 列名
            db_index           -> 索引
            unique               -> 唯一索引
            unique_for_date    ->
            unique_for_month
            unique_for_year
            auto_now           -> 创建时,自动生成时间
            auto_now_add       -> 更新时,自动更新为当前时间
             
                # obj = UserGroup.objects.filter(id=1).update(caption='CEO')
                # obj = UserGroup.objects.filter(id=1).first()
                # obj.caption = "CEO"
                # obj.save()
                 
            choices              -> django admin中显示下拉框,避免连表查询
            blank             -> django admin是否可以为空
            verbose_name      -> django admin显示字段中文
            editable          -> django admin是否可以被编辑
            error_messages    -> 错误信息欠
            help_text         -> django admin提示
            validators          -> django form ,自定义错误信息(欠)
             
             
            创建 Django 用户:python manage.py createsuperuser
             
             
             
             
    2. 根据类对数据库表中的数据进行各种操作
     
        一对多:
         
            a. 外检
            b.
                外键字段_id
            c.
                models.tb.object.create(name='root', user_group_id=1)
                 
            d.
                 
                userlist = models.tb.object.all()
                for row in userlist:
                    row.id
                    row.user_group_id
                    row.user_group.caption
 
1、Django请求的生命周期
        路由系统 -> 试图函数(获取模板+数据=》渲染) -> 字符串返回给用户
         
2、路由系统
        /index/                ->  函数或类.as_view()
        /detail/(\d+)          ->  函数(参数) 或 类.as_view()(参数)
        /detail/(?P<nid>\d+)   ->  函数(参数) 或 类.as_view()(参数)
        /detail/               ->  include("app01.urls")
        /detail/    name='a1'  ->  include("app01.urls")
                               - 视图中:reverse
                               - 模板中:{% url "a1" %}
                                
3、视图
    FBV:函数
        def index(request,*args,**kwargs):
            ..
     
    CBV:类
        class Home(views.View):
             
            def get(self,reqeust,*args,**kwargs):
                ..
                 
    获取用户请求中的数据:
        request.POST.get
        request.GET.get
        reqeust.FILES.get()
         
        # checkbox,
        ........getlist()
         
        request.path_info
         
         
        文件对象 = reqeust.FILES.get()
        文件对象.name
        文件对象.size
        文件对象.chunks()
         
        # <form 特殊的设置></form>
         
         
    给用户返回数据:
        render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
        redirect("URL")
        HttpResponse(字符串)
         
     
4、模板语言
        render(request, "模板的文件的路径", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
     
    <html>
     
    <body>
        <h1> {{ obj }} </h1>
        <h1> {{ k1.3 }} </h1>
        <h1> {{ k2.name }} </h1>
        {% for i in k1 %}
            <p> {{ i }} </p>
        {% endfor %}
         
        {% for row in k2.keys %}
            {{ row }}
        {% endfor %}
         
        {% for row in k2.values %}
            {{ row }}
        {% endfor %}
         
        {% for k,v in k2.items %}
            {{ k }} - {{v}}
        {% endfor %}
         
    </body>
    </html>
     
5、ORM
    a. 创建类和字段
        class User(models.Model):
            age = models.IntergerFiled()
            name = models.CharField(max_length=10)#字符长度
             
        Python manage.py makemigrations
        python manage.py migrate
         
        # settings.py 注册APP
         
    b. 操作
         
        
            models.User.objects.create(name='qianxiaohu',age=18)
            dic = {'name': 'xx', 'age': 19}
            models.User.objects.create(**dic)
             
             
            obj = models.User(name='qianxiaohu',age=18)
            obj.save()
        
            models.User.objects.filter(id=1).delete()
        
            models.User.objects.filter(id__gt=1).update(name='alex',age=84)
            dic = {'name': 'xx', 'age': 19}
            models.User.objects.filter(id__gt=1).update(**dic)
        
            models.User.objects.filter(id=1,name='root')
            models.User.objects.filter(id__gt=1,name='root')
            models.User.objects.filter(id__lt=1)
            models.User.objects.filter(id__gte=1)
            models.User.objects.filter(id__lte=1)
             
            models.User.objects.filter(id=1,name='root')
            dic = {'name': 'xx', 'age__gt': 19}
            models.User.objects.filter(**dic)
             
            v1 = models.Business.objects.all()
            # QuerySet ,内部元素都是对象
             
            # QuerySet ,内部元素都是字典
            v2 = models.Business.objects.all().values('id','caption')
            # QuerySet ,内部元素都是元组
            v3 = models.Business.objects.all().values_list('id','caption')
         
            # 获取到的一个对象,如果不存在就报错
            models.Business.objects.get(id=1)
            对象或者None = models.Business.objects.filter(id=1).first()
             
             
            外键:
                v = models.Host.objects.filter(nid__gt=0)
                v[0].b.caption  ---->  通过.进行跨表
 
        外键:
            class UserType(models.Model):
                caption = models.CharField(max_length=32)
              id  caption
            # 1,普通用户
            # 2,VIP用户
            # 3, 游客
                 
            class User(models.Model):
                age = models.IntergerFiled()
                name = models.CharField(max_length=10)#字符长度
                # user_type_id = models.IntergerFiled() # 约束,
                user_type = models.ForeignKey("UserType",to_field='id') # 约束,
         
              name age  user_type_id    
            # 张扬  18     3
            # 张A扬 18     2
            # 张B扬 18     2
     
    position:fixed absolute relative
 
     
    Ajax
     
        $.ajax({
            url: '/host',
            type: "POST",
            data: {'k1': 123,'k2': "root"},
            success: function(data){
                // data是服务器端返回的字符串
                var obj = JSON.parse(data);
            }
        })
     
        建议:永远让服务器端返回一个字典
         
        return HttpResponse(json.dumps(字典))
         
            
多对多:
    创建多对多:
        方式一:自定义关系表
            class Host(models.Model):
                nid = models.AutoField(primary_key=True)
                hostname = models.CharField(max_length=32,db_index=True)
                ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
                port = models.IntegerField()
                b = models.ForeignKey(to="Business", to_field='id')
            # 10
            class Application(models.Model):
                name = models.CharField(max_length=32)
            # 2
             
            class HostToApp(models.Model):
                hobj = models.ForeignKey(to='Host',to_field='nid')
                aobj = models.ForeignKey(to='Application',to_field='id')
                 
            # HostToApp.objects.create(hobj_id=1,aobj_id=2)
                 
        方式二:自动创建关系表
            class Host(models.Model):
                nid = models.AutoField(primary_key=True)
                hostname = models.CharField(max_length=32,db_index=True)
                ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
                port = models.IntegerField()
                b = models.ForeignKey(to="Business", to_field='id')
            # 10
            class Application(models.Model):
                name = models.CharField(max_length=32)
                r = models.ManyToManyField("Host")
                 
            无法直接对第三张表进行操作
             
            obj = Application.objects.get(id=1)
            obj.name
             
            # 第三张表操作
            obj.r.add(1)
            obj.r.add(2)
            obj.r.add(2,3,4)
            obj.r.add(*[1,2,3,4])
             
            obj.r.remove(1)
            obj.r.remove(2,4)
            obj.r.remove(*[1,2,3])
             
            obj.r.clear()
             
            obj.r.set([3,5,7])
             
            # 所有相关的主机对象“列表” QuerySet
            obj.r.all()
   

  

posted @   西门运维  阅读(708)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示