django版本区别
区别一:
django1.x路由层使用的是url方法
而在django2.x 和 3.x 版本中路由层使用的时path方法
url()第一个参数支持正则
path()第一个参数时不支持正则的,写什么就匹配什么(精准匹配)
# 如果你习惯使用正则那么也给你提供了另外一个方法:
from django.urls import path,re_path # re_path模块支持匹配正则
from django.conf.urls import url
urlpatterns = [
path(\'admin/\', admin.site.urls),
re_path(\'login/\',login), # 可匹配正则
url(\'reg/\',reg) # 也可以导入url来使用但是不推荐使用(2.x 3.x版本区分)
]
# 2.x 3.x 里面的re_path就等价于1.x里面的url
区别二:
虽然path不支持正则,但是他的内部支持五种转换器
path(\'index/<int:id>/\',index)
# 将第二个路由里面的内容先转成整型然后以关键字的形式传递给后面的视图函数
from django.contrib import admin
from django.urls import path,re_path
from django.conf.urls import url
from django.shortcuts import HttpResponse
def login(request,id):
print(id)
print(type(id))
return HttpResponse(\'login\')
def reg(request,xx):
print(xx)
print(type(xx))
return HttpResponse(\'reg\')
urlpatterns = [
path(\'admin/\', admin.site.urls),
path(\'login/<int:id>/\',login),
url(\'reg/(\d+)/\',reg)
]
# 转换器
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
区别三:
3.除了有默认的五个转换器之外 还支持自定义转换器(了解)
class MonthConverter:
regex=\'\d{2}\' # 属性名必须为regex
def to_python(self, value):
return int(value)
def to_url(self, value):
return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
from django.urls import path,register_converter
from app01.path_converts import MonthConverter
# 先注册转换器
register_converter(MonthConverter,\'mon\')
from app01 import views
urlpatterns = [
path(\'articles/<int:year>/<mon:month>/<slug:other>/\', views.article_detail, name=\'aaa\'),
区别四:
4.模型层里面1.X外键默认都是级联更新删除的
但是到了2.X和3.X中需要你自己手动配置参数
models.ForeignKey(to=\'Publish\') # 1.x版本
models.ForeignKey(to=\'Publish\',on_delete=models.CASCADE,) # 2.x版本后
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
TypeError: __init__() missing 1 required positional argument: \'on_delete\'
# 参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。