1. 程式人生 > 其它 >Django框架各版本區別

Django框架各版本區別

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