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()

posted on 2019-11-25 20:58  shenblogs  阅读(172)  评论(0)    收藏  举报

导航