Django4.0搶先看,結果令人失望
Django 4.0版本說明
2021年12月7日,Django正式釋出了4.0版本!
這貨的版本提升速度也太快了,完全名不副實!再看看新功能,這都更新了啥?
Python 依賴
Django 4.0依賴Python 3.8+。也就是說低於這個版本的Python不行。
新功能
zoneinfo
成為預設的時區庫
Python的標準庫zoneinfo替代了過去的pytz庫,成為Django的預設時區庫。
Django3.2是個過渡版本,可以使用非pytz的時區庫。
Django4.0中,zoneinfo成為預設時區庫。
Django5.0中,pytz會被移除。
zoneinfo從Python3.9開始成為內建標準庫。如果你用的是Python3.8,安裝Django的時候,自動安裝的是 backports.zoneinfo
從pytz
改為使用zoneinfo
,基本是透明無感的。比如當前時區的選擇、在表單和模板中時區的轉換等等操作都不受影響。
但是,如果您使用了非 UTC 時區,並使用pytz
normalize()
和localize()
API,或者對TIME_ZONE
進行了設定,那麼你需要稽核您的程式碼,因為pytz
和zoneinfo
並不完全相同。
為了給程式碼審計留出時間,Django提供了一個過渡性的USE_DEPRECATED_PYTZ
設定,將它設定為True,表示允許pytz
在 Django4.x 版本釋出週期期間繼續使用。此設定將在 Django 5.0 中刪除。
此外,zoneinfo
庫的作者特意提供了一個pytz_deprecation_shim
包,使用者幫助你從pytz遷移到zoneinfo。有需要的可以詳細瞭解一下這個包。
點評:換個時區庫就能從3升級到4?
函式類唯一性約束
UniqueConstraint()
新增了一個*expressions
位置引數,可用於建立唯一性約束,在表示式上或資料庫函式上。例如:
from django.db import models from django.db.models import UniqueConstraint from django.db.models.functions import Lower class MyModel(models.Model): first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) class Meta: constraints = [ UniqueConstraint( Lower('first_name'), Lower('last_name').desc(), name='first_last_name_unique', ), ]
使用模型的Meta.constraints
選項將功能唯一性約束新增到模型中 。
點評:你有多大概率用上這個新特性?或者,你明白它的用法了嗎?
scrypt
密碼雜湊演算法
新的scrypt 密碼雜湊演算法比 PBKDF2 演算法更安全,推薦使用。但是,它不是預設設定,因為它需要 OpenSSL 1.1+ 依賴和更多記憶體。
點評:這麼細節嗎?
Redis快取後端
新增內建的django.core.cache.backends.redis.RedisCache
快取後端,為直接使用 Redis 快取提供了內建支援。但是需要 redis-py 3.0.0 或更高版本。
點評:這個還算有點意思
基於模板引擎的表單渲染
Forms
、Formsets
和ErrorList
現在使用模板引擎進行渲染以增強自定義的能力。詳見新的render()
, get_context()
方法以及 template_name
屬性。
點評:表單用得本來就不多
一些小特性
- admin後臺的導航側邊欄新增了快速過濾工具欄
- auth模組的PBKDF2密碼雜湊的迭代次數提高到320000
- 新增非同步的快取後端
django.core.cache.backends.base.BaseCache
。相應的非同步方法以a開頭,比如aadd()
,aget()
,aset()
,aget_or_set()
和adelete_many()
。 - 通用檢視
DeleteView
現在繼承了FormMixin
類,允許你提供一個Form
子類,用於提供一些自定製,比如用於確認刪除的複選框。同時還允許它使用django.contrib.messages.views.SuccessMessageMixin
-
runserver
管理命令新增--skip-checks
選項,可以跳過一些檢查過程。 -
新增
startapp --exclude
和startproject --exclude
選項,允許指定排除模板中的目錄。 -
新增
QuerySet.contains(obj)
方法,用於判定查詢集中是否包含給定的物件。它會嘗試以最簡單和最快的方式執行查詢。 -
其它更多小細節未一一列出
更多向後不相容和廢棄功能的細節參考官方文件,實在無法逐一列出。