day53-django表关系、请求生命周期、路由层、Django版本区别
目录
表关系
#一对多
models.ForeignKey(to='表',to_field='字段',to_delete='级联操作')
#默认关联主键字段
#默认级联删除和更新(models.CASCADE),只在应用层生效,在db层(数据库直接操作)RESTRICT(受限制)
#多对多,建议建在查询频率较高的表中,虚拟字段,在表中看不见,orm会自动创建一张关系表
models.ManyToManyField(to='表')
#一对一,建议建在查询频率较高的表中
models.OneToOneField(to='表')
#外键+唯一,不推荐
models.FoeignKey(to='表',db_constraint='unique')
请求生命周期

Django路由层
路由匹配
from django.conf.urls import url
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
'''
注意:
1.urlpatterns中的元素按照顺序逐一匹配正则表达式,一旦成功匹配就不再继续
2.若要从URL中捕获一个值,需要使用分组匹配
3.不需要添加前导的反斜杠
4.最好在正则表达式前加上r
'''
无名分组
将分组内正则表达式匹配到的内容当作位置参数传递给视图函数
#视图层对应函数要多加一参数接受
url(r'^test/([0-9]{4})/', views.test)
有名分组
将分组内正则表达式匹配到的内容当作关键字参数传递给视图函数
url(r'^testadd/(?P<year>\d+)/', views.testadd)
注意
有名和无名不能混用
反向解析
根据一个别名,动态解析出一个结果,该结果可以直接访问对应的url
没有正则的url
settings
urlpatterns = [
url(r'^home/', views.home,name='xxx')
]
前端
{% url 'xxx' %}
后端
from django.shortcuts import reverse
url = reverse('xxx')
无名分组的反向解析
需要手动指定一个默认的正则表达式匹配的内容
settings
url(r'^home/(\d+)/', views.home,name='xxx')
前端
<p><a href="{% url 'xxx' 12 %}">111</a></p>
后端
from django.shortcuts import reverse
url = reverse('xxx',args=(1,))
有名分组的反向解析
有名分组的反向解析可以和无名分组的一样
路由分发
前提是每个app都有自己的urls、static和templates
总路由
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^admin/', admin.site.urls), # url第一个参数是一个正则表达式
# 路由分发
url(r'^app01/',include(app01_urls)), # 路由分发需要注意的实现 就是总路由里面不能以$结尾
url(r'^app02/',include(app02_urls)),
]
#以下写法不需要再导入
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
子路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url('^reg/',views.reg)
]
名称空间
即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL
#总路由
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
#前端
<a href="{% url 'app01:reg' %}"></a>
<a href="{% url 'app02:reg' %}"></a>
#后端
print(reverse('app01:reg'))
print(reverse('app02:reg'))
#简便方法:别名同一加上应用名前缀
伪静态
将一个网页伪装成一个静态网页,以此来提高搜索引擎SEO的查询频率和收藏力度
虚拟环境
相当于一个未安装任何模块的python解释器
Django版本区别
urls.py中路由匹配的方法有区别
django2.X用的是path
urlpatterns = [
path('admin/', admin.site.urls),
]
django1.X用的是url
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]
# 区别 django2.X里面path第一个参数不是正则也不支持正则 写什么就匹配什么
# 虽然path不支持正则 感觉也好用 django2.X还有一个re_path的方法 该方法就是你django1.X里面url
# 虽然path支持 但是它提供了五种转换器 能够将匹配到的数据自动转黄成对应的类型
# 除了有默认五种转换器之外 还支持你自定义转换器
request方法获取文件数据
file_obj = request.FILES.get('myfile')
file_obj.name 文件名
f = open(file.obj.name,'wb')
for chunk in file_obj.chunks(): # for line in file_obj:
f.write(chunk)
f.close()
浙公网安备 33010602011771号