61-django-数据增删改、orm创建表关系、django请求生命周期流程图、路由层之路由匹配、无名分组、有名分组

今日内容概要

  • 数据的查,改,删
  • django orm中如何创建表关系
  • django请求生命周期流程图(重要)
  • 路由层
    • 路由匹配
    • 有名分组
    • 无名分组

今日内容详细

数据的查,改,删

 1 # 先讲数据库中的数据全部展示到前端 然后给每一个数据两个按钮 一个编辑一个删除
 2 
 3 # 查看
 4 def userlist(request):
 5     # 查询出用户表里面所有的数据
 6     # 方式1
 7     # data = models.User.objects.filter()
 8     # print(data)
 9     # 方式2
10     user_queryset = models.User.objects.all()
11     # return render(request,'userlist.html',{'user_queryset':user_queryset})
12     return render(request,'userlist.html',locals())
13 
14 # 编辑功能
15     # 点击编辑按钮朝后端发送编辑数据的请求
16   """
17   如何告诉后端用户想要编辑哪条数据?
18       将编辑按钮所在的那一行数据的主键值发送给后端
19       利用url问号后面携带参数的方式
20       
21       {% for user_obj in user_queryset %}
22                         <tr>
23                             <td>{{ user_obj.id }}</td>
24                             <td>{{ user_obj.username }}</td>
25                             <td>{{ user_obj.password }}</td>
26                             <td>
27                                 <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
28                                 <a href="" class="btn btn-danger btn-xs">删除</a>
29                             </td>
30                         </tr>
31                     {% endfor %}
32   """
33   # 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑
34   def edit_user(request):
35     # 获取url问号后面的参数
36     edit_id = request.GET.get('user_id')
37     # 查询当前用户想要编辑的数据对象
38     edit_obj = models.User.objects.filter(id=edit_id).first()
39 
40     if request.method == "POST":
41         username = request.POST.get('username')
42         password = request.POST.get('password')
43         # 去数据库中修改对应的数据内容
44         # 修改数据方式1
45         # models.User.objects.filter(id=edit_id).update(username=username,password=password)
46         """
47             将filter查询出来的列表中所有的对象全部更新            批量更新操作
48             只修改被修改的字段
49         """
50 
51         # 修改数据方式2
52         edit_obj.username = username
53         edit_obj.password= password
54         edit_obj.save()
55         """
56             上述方法当字段特别多的时候效率会非常的低
57             从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
58         """
59         
60         # 跳转到数据的展示页面
61         return redirect('/userlist/')
62 
63 
64 
65     # 将数据对象展示到页面上
66     return render(request,'edit_user.html',locals())
67 
68 # 删除功能
69     """
70     跟编辑功能逻辑类似
71     def delete_user(request):
72     # 获取用户想要删除的数据id值
73     delete_id = request.GET.get('user_id')
74     # 直接去数据库中找到对应的数据删除即可
75     models.User.objects.filter(id=delete_id).delete()
76     """
77         批量删除
78     """
79     # 跳转到展示页面
80 
81     return redirect('/userlist/')    
82     
83     """
84 # 真正的删除功能应该需要二次确认 我们这里先不做后面会讲
85 # 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态
86 username               password              is_delete
87   jason            123                0
88   egon            123                1

django orm中如何创建表关系

 1 """
 2 表与表之间的关系
 3     一对多
 4     
 5     多对多
 6     
 7     一对一
 8     
 9     没有关系
10 
11 判断表关系的方法:换位思考
12 """
13 图书表
14 
15 出版社表
16 
17 作者表
18 
19 作者详情表
20 
21 
22 """
23 图书和出版社是一对多的关系 外键字段建在多的那一方 book
24     
25 图书和作者是多对多的关系 需要创建第三张表来专门存储
26 
27 作者与作者详情表是一对一
28 """
29 from django.db import models
30 
31 # Create your models here.
32 
33 
34 # 创建表关系  先将基表创建出来 然后再添加外键字段
35 class Book(models.Model):
36     title = models.CharField(max_length=32)
37     price = models.DecimalField(max_digits=8,decimal_places=2)
38     # 总共八位 小数点后面占两位
39     """
40     图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
41     """
42     publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
43     """
44     如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
45     如果你自作聪明的加了_id那么orm还是会在后面继续加_id
46     
47     后面在定义ForeignKey的时候就不要自己加_id
48     """
49 
50 
51     """
52     图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
53     """
54     authors = models.ManyToManyField(to='Author')
55     """
56     authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
57     让orm自动帮你创建第三张关系表
58     """
59 
60 
61 class Publish(models.Model):
62     name = models.CharField(max_length=32)
63     addr = models.CharField(max_length=32)
64 
65 
66 class Author(models.Model):
67     name = models.CharField(max_length=32)
68     age = models.IntegerField()
69     """
70     作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
71     """
72     author_detail = models.OneToOneField(to='AuthorDetail')
73     """
74     OneToOneField也会自动给字段加_id后缀
75     所以你也不要自作聪明的自己加_id
76     """
77 
78 class AuthorDetail(models.Model):
79     phone = models.BigIntegerField()  # 或者直接字符类型
80     addr = models.CharField(max_length=32)
81 
82 
83 """
84     orm中如何定义三种关系
85         publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
86         
87         authors = models.ManyToManyField(to='Author')
88         
89         author_detail = models.OneToOneField(to='AuthorDetail')
90         
91         
92         ForeignKey
93         OneToOneField
94             会自动在字段后面加_id后缀
95 """
96 
97 # 在django1.X版本中外键默认都是级联更新删除的
98 # 多对多的表关系可以有好几种创建方式 这里暂且先介绍一种
99 # 针对外键字段里面的其他参数 暂时不要考虑 如果感兴趣自己可以百度试试看

django请求生命周期流程图(必会)

 1 # 每个人都要会画 这个图是你们后期复习django最好的一个梳理方式
 2 
 3 
 4 # 扩展知识点
 5 
 6     """
 7     缓存数据库
 8         提前已经将你想要的数据准备好了 你来直接拿就可以
 9         提高效率和响应时间
10         
11     当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的
12     而是需要经过一段时间才会修改
13         博客园
14     
15     了解即可
16     """

路由层

路由匹配

 1 # 路由匹配
 2 url(r'test',views.test),
 3 url(r'testadd',views.testadd)
 4 """
 5 url方法第一个参数是正则表达式
 6     只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
 7     直接执行对应的视图函数
 8 
 9 你在输入url的时候会默认加斜杠
10     django内部帮你做到重定向
11         一次匹配不行
12         url后面加斜杠再来一次
13 """
14 # 取消自动加斜杠
15 APPEND_SLASH = False/True    # 默认是自动加斜杠的
16 
17 
18 urlpatterns = [
19     url(r'^admin/', admin.site.urls),
20     # 首页
21     url(r'^$',views.home),
22     # 路由匹配
23     url(r'^test/$',views.test),
24     url(r'^testadd/$',views.testadd),
25     # 尾页(了解)
26     url(r'',views.error),
27 ]

无名分组

 1 """
 2 分组:就是给某一段正则表达式用小括号扩起来
 3 """
 4 url(r'^test/(\d+)/',views.test)
 5 
 6 def test(request,xx):
 7     print(xx)
 8     return HttpResponse('test')
 9   
10 # 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数

有名分组

 1 """
 2 可以给正则表达式起一个别名
 3 """
 4 url(r'^testadd/(?P<year>\d+)',views.testadd)
 5 
 6 def testadd(request,year):
 7     print(year)
 8     return HttpResponse('testadd')
 9 
10 # 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数

无名有名是否可以混合使用

1 """
2 嘻嘻 不能混用
3 但是同一个分组可以使用N多次
4 """
5 
6 # 单个的分组可以使用多次
7 url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
8 url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),

反向解析

 1 # 通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
 2 
 3 # 先给路由与视图函数起一个别名
 4     url(r'^func_kkk/',views.func,name='ooo')
 5 # 反向解析
 6     # 后端反向解析
 7       from django.shortcuts import render,HttpResponse,redirect,reverse
 8       reverse('ooo')
 9   # 前端反向解析
10       <a href="{% url 'ooo' %}">111</a>

今日考题

1 """
2 今日考题
3 1.列举你知道的orm数据的增删改查方法
4 2.表关系如何判定,django orm中如何建立表关系,有什么特点和注意事项
5 3.请画出完整的django请求生命周期流程图
6 4.无名、有名分组各是什么意思
7 5.反向解析是什么,如何使用,
8 """

今日内容回顾

数据的编辑和删除

 1 # 查询所有数据
 2     res = models.User.objects.filter()
 3   res = models.User.objects.all()
 4 # 编辑数据
 5     """
 6     1.首先得获取用户想要编辑的数据主键值
 7             url?edit_id=1
 8             url/1/
 9     2.后端查询出对应的数据对象展示到前端
10             利用input标签的value属性
11     3.提交post请求修改数据
12             前期提交post请求一定要先去配置文件中注释点一行(csrf...)
13             如果不注释会报403错误
14     """
15   # 批量更新
16     models.User.objects.filter(id=edit_id).update(**kwargs)
17   # 单个更新
18   user_obj = models.User.objects.filter(id=edit_id).first()
19   user_obj.username = 'jason'
20   user_obj.passsword = '666'
21   user_obj.save()
22   """
23   该方法当字段比较多的时候效率很降低很多
24   因为它是从头到尾讲数据所有的字段重新写一遍
25   """
26 # 删除数据
27     """
28     1.数据并不会真正意义上的删除,我们在创建表的时候会加一个用来标示是否被删除的字段
29         is_delete
30         is_alive
31         is_status
32         ...
33     删数据其实就是修改字段的状态 之后通过代码筛选出没有删除的状态数据即可
34     
35     2.删除数据的时候应该有一个二次确认的过程而不应该直接删除
36         ajax讲完之后加二次确认结合sweetalaert
37     """
数据的编辑和删除

图书管理系统表设计(orm创建表关系)

 1 class User:
 2   models.ForeignKey(to='Publish')
 3   models.ForeignKey(to=Publish)  # 报错
 4   
 5 class Publish:
 6   pass
 7 
 8 """
 9 一对多
10     models.ForeignKey(to='关联表名')  常用
11     models.ForeignKey(to=关联表名)      关联表名必须出现在上方(了解即可)
12         1.在django1.X版本中外键默认就是级联更新删除的
13         2.会自动给字段加_id后缀 无论你有没有加(自己不要自作聪明的加上)
14         3.一对多 外键字段建在多的一方
15         
16 一对一
17     models.OneToOneField(to='关联表名')
18         1.在django1.X版本中外键默认就是级联更新删除的
19         2.会自动给字段加_id后缀 无论你有没有加(自己不要自作聪明的加上)
20         3.外键建在任意一方均可 但是推荐你建在查询频率较高的表中(orm查询方便)
21         
22 多对多
23     models.ManyToManyField(to='关联表名')
24         1.在django1.X版本中外键默认就是级联更新删除的
25         2.该字段是一个虚拟字段不会真正的在表中展示出来 而是用来告诉Django orm当前表和关联表是多对多的外键关系 需要自动创建第三张关系表
26         3.在Django orm中多对多的表关系有好几种(三种)创建方式
27         4.外键建在任意一方均可 但是推荐你建在查询频率较高的表中(orm查询方便)
28         
29 判断表关系的方式:换位思考
30 """
图书管理系统表设计(orm创建表关系)

django请求生命周期流程图

 1 """
 2 浏览器
 3     发送请求(HTTP协议)
 4 
 5 web服务网关接口
 6     1.请求来的时候解析封装
 7         响应走的时候打包处理
 8 
 9     2.django默认的wsgiref模块不能承受高并发 最大只有1000左右
10         上线之后会替换成uwsgi来增加并发量
11     
12     3.WSGI跟wsgiref和uwsgi是什么关系
13         WSGI是协议
14         wsgiref和uwsgi是实现该协议的功能模块
15 
16 django后端
17     1.django中间件(暂时不考虑 后面讲)
18         类似于django的保安 门户
19         
20     2.urls.py  路由层
21         识别路由匹配对应的视图函数
22     
23     3.views.py    视图层
24         网站整体的业务逻辑
25         
26     4.templates文件夹        模版层
27         网站所有的html文件
28     
29     5.models.py                模型层
30         ORM
31 额外扩展:缓存数据库的作用
32 """
django请求生命周期流程图

路由匹配

 1 """
 2 url()方法第一个参数是正则表达式
 3 一旦匹配成功了 就不会往下走了 而是直接触发正则后面的视图函数的运行
 4 
 5 url(r'^admin/',...)
 6 
 7 # 首页
 8 url(r'^$',...)
 9 # 尾页
10 url(r'',...)
11 """
12 
13 # django路由匹配的时候其实可以匹配两次  第一次如果url后面没有加斜杠 django会让浏览器加斜杠再发送一次请求
14 配置文件
15 APPEND_SLASH = True/False
路由匹配

无名有名分组

 1 # 无名分组
 2 url(r'^index/(\d+)/',view.index)
 3 """
 4 将括号内正则表达式匹配的内容当作位置参数传递给后面的视图函数
 5 index(request,111)
 6 """
 7 
 8 # 有名分组
 9 url(r'^index/(?P<year>\d+)/',view.index)
10 """
11 将括号内正则表达式匹配的内容当作关键字参数传递给后面的视图函数
12 index(request,year=111)
13 """
14 
15 # 无名和有名不能混合使用
16 
17 # 单个分组都可以重复使用
18 url(r'^index/(\d+)/(\d+)/(\d+)/',view.index)
19 url(r'^index/(?P<year>\d+)/(?P<xxx>\d+)/(?P<ooo>\d+)/',view.index)
无名有名分组

反向解析

 1 """
 2 本质:通过一些方法得到一个结果 该结果可以访问到对应的url从而触发视图函数的运行
 3 """
 4 # 最简单的情况 url第一个参数里面没有正则符号
 5     url(r'^index/',view.index,name='xxx')
 6 # 前端
 7     {% url 'xxx' %}
 8 # 后端
 9     from django.shortcuts import reverse
10   reverse('xxx')
11 """
12 别名不能出现冲突!!!
13 """
反向解析

作业

1 """
2 必做题:
3 1.整理今日内容到博客
4 2.自己完成单表的增删改查功能(结合前端鼠标点点操作)
5 3.自己找几张表练习如何创建表与表之间的关系
6 选做题:
7 1.尝试着利用路由匹配和反向解析完成数据的编辑和删除功能
8 2.构思图书管理系统(后面会讲,自己先尝试着看看)
9 """

猜你喜欢

转载自www.cnblogs.com/wgwg/p/13056603.html