路由匹配
django2.x及以上path第一个参数写什么就匹配什么,django1.x第一个参数是正则表达式
转换器(动态匹配)
str:匹配除路径分隔符外的任何非空字符串(常用)
int:匹配0或者任意正整数(一般)
path:能够匹配完整的URL路径
正则匹配的无名分组
re_path('^test/(\d{4})/',views.test)
会将括号内正则匹配到的内容当做位置参数传递给视图函数
正则匹配的有名分组
re_path('^test/(?P<year>\d{4})/',views.test) test(实参request对象,year='\d{4}匹配到的内容',others='.*?匹配到的内容')
会将括号内正则匹配到的内容当做关键字参数传递给视图函数
注意:有名和无名不能混合使用!!!
反向解析:通过一个名字可以反向解析出一个结果,该结果可以访问到某个对应的路由
基本使用
1.路由匹配关系起别名 path('login/',views.login, name='login_view')
2.反向解析语法
html页面上模板语法{%url 'login_view'%}
后端语法 reverse('login_view')
动态路由的反向解析
path('func1/<str:others>/',views.func1_func,name='func1_view')
html页面上模板语法 {% url 'func1_view' 'jason'%}
后端语法 reverse{'func1_view',args=('嘿嘿嘿',)}
django支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起
多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中
使用路由分发之前 总路由直接干路由与视图函数的匹配
path('index/', index)
使用路由分发之后 总路由只按照应用名分配匹配方向
path('app01/', include('app01.urls'))
名称空间
路由分发之后,针对相同的别名能否自动反向解析出不同的应用前缀,默认情况是无法自动识别应用前缀的
正常识别区分有2种方式:1.名称空间 2.别名不冲突即可
虚拟环境:能够针对相同版本的解释器创建多个分身,每个分身可以有自己的独立环境
模板层
{{}}:主要与数据值相关 {%%}:主要与逻辑相关(循环、判断)
django的模板语法是自己写的 跟jinja2不一样
1.针对需要加括号调用的名字,django模板语法会自动加括号调用
2.模板语法的注释前端浏览器是无法查看的
模板语法传值
传值方式1:指名道姓的传
return render(request,'damo02.html',{'n1':name,'a1':age})
传值方式2:打包传值 适用于数据量较多的情况(偷懒)
'''locals()将当前名称空间中所有的名字全部传递给html页面'''
return render(request,'damo02.html',locals())
模板层之标签
{%if 条件%}
内容块
{%elif 条件%}
内容块
{%else%}
内容块
{%endif%}
{%for foo in d1%}
内容块
{%endfor%}
django模板语法取值操作:支持句点符
模板的继承与导入
1.在模板中使用block划定子板以后可以修改的区域
{% block 区域名称%}
{%endblock%}
2.子板继承模板
{%extends 'home.html'%}
{% block 区域名称%}
子板自己的内容
{% endblock%}
ps:模板中至少应该有三个区域:页面内容区、css样式区、js代码区
模型层之单独搭建测试环境
1.拷贝manage.py前四行
2.自己再加两行
import django
django.setup()
ORM常用关键字
create() 创建数据并直接获取当前创建的数据对象
filter() 根据条件筛选数据,结果是QuerySet[数据对象]
first() last() QuerySet支持索引取值但是只支持正数,并且ORM不建议使用
update() 更新数据(批量更新)
delete() 删除数据(批量删除)
all() 查询所有数据 结果是QuerySet[数据对象]
values()根据指定字段获取数据 结果是QuerySet[{},{}]
values_list() 根据指定字段获取数据 结果是QuerySet[(),()]
distinct() 去重 数据一定要一模一样才可以,如果有主键肯定不行
order_by() 根据指定条件排序,默认是升序,字段前面加负号就是降序
get() 根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错
exclude() 取反操作
reverse()颠倒顺序(被操作的对象必须是经过排序才可以)
count() 统计结果集中数据的个数
exists() 判断结果集中是否含有数据 如果有则返回True,没有返回False
ORM外键字段
一对多 ORM与mysql一致 外键字段建在多的一方
多对多 ORM比Mysql有更多变化
1.外键字段可以直接建在某张表中(查询频率较高),内部会自动创建第三张关系表
2.自己创建第三张关系表并创建外键字段
一对一 ORM与mysql一致 外键字段建在查询较高的一方
3.ORM创建
针对一对多和一对一同步到表中之后会自动加_id的后缀
publish=models.ForeignKey(to='Publish',on_delete=models.CASCADE)
author_detail=models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
针对多对多 不会在表中有展示 而是创建第三张表
authors = models.ManyToManyField(to='Author')
正反向查询的概念
正向查询:由外键字段所在的表数据查询关联的表数据 正向
反向查询:没有外键字段的表数据查询关联的表数据 反向
ORM跨表查询的口诀
正向查询按外键字段
反向查询按表名小写
聚合函数:Max Min Sum Count Avg
在ORM中支持单独使用聚合函数 aggregate
分组查询关键字 annotate
查询的数据涉及到数据库里取建议使用F/Q
标签:第十二,总结,匹配,查询,ORM,路由,path,模板
From: https://www.cnblogs.com/winter-yu1989/p/16990827.html