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就可以了。