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 """
相关文章
相关标签/搜索