【Django版本的区别】

本文介绍了Django1.x到2.x/3.x版本中路由匹配的变化,包括从url到path的升级以及如何使用re_path进行正则匹配。同时,详细阐述了path的转换器功能,如内置的str、int、slug和uuid等,并展示了如何自定义转换器以满足特定需求。在模型层,讨论了Django1.x中外键默认的级联行为与2.x/3.x版本中需要显式指定的差异。

路由匹配的区别

Django 1.x 版本

from django.urls import url

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

第一个参数支持正则表达式

Django2.x和3.x版本

from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

第一个参数不支持正则,写的什么参数,就按照什么参数来匹配!

如果想要使用正则也可以,导入一个模块re_path即可


from django.urls import re_path

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
]

装换器

Django 2.x 与 3.x 版本 path还支持转换器功能

针对路径http://127.0.0.1:8000/articles/2009/123/hello/,path会匹配出参数year=2009,month=123,other='hello’传递给函数article_detail

urlpatterns = [
    path('articles/<int:year>/<int:month>/<slug:other>/', views.article_detail),
]

五种默认的转换器(相当于一个有名分组,自动帮你转换成指定类型的数据)

str:xxx: 默认的类型,匹配非空字符串,不包含路径分隔符/
int:xxx:匹配非负整数
slug:xxx:匹配字母、数字已经横杠-、下划线_ 组成的字符串
uuid:xxx:**匹配格式化的 UUID **
path:xxx:匹配任何非空字符串,包含路径分隔符/,不能用?

针对月份month,转换器int是无法精准匹配的,如果我们只想匹配两个字符,那么转换器slug也无法满足需求,针对等等这一系列复杂的需要,我们可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

  1. regex 类属性,字符串类型
  2. to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  3. to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

自定义转换器示例:

在app01下新建文件path_ converters.py,文件名可以随意命名

class MonthConverter:
    regex='\d{2}' # 属性名必须为regex

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return value # 匹配的regex是两个数字,返回的结果也必须是两个数字


在urls.py中,使用register_converter 将其注册到URL配置中:

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'),

]

views.py中的视图函数article_detail

from django.shortcuts import render,HttpResponse,reverse

def article_detail(request,year,month,other):
    print(year,type(year))
    print(month,type(month))
    print(other,type(other))
    print(reverse('xxx',args=(1988,12,'hello'))) # 反向解析结果/articles/1988/12/hello/
    return HttpResponse('xxxx')


测试

1、在浏览器输入http://127.0.0.1:8000/articles/2009/12/hello/,path会成功匹配出参数year=2009,month=12,other='hello’传递给函数article_detail
2、在浏览器输入http://127.0.0.1:8000/articles/2009/123/hello/,path会匹配失败,因为我们自定义的转换器mon只匹配两位数字,而对应位置的123超过了2位

模型层的区别

models.py中创建外键,会有区别

Django 1.x 版本 :创建外键默认就是级联更新,级联删除

Django 2.x 与 3.x 版本:需要自己指定 字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值