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
庫。所以,一條基本原則是:最新的Django配最新的Python。
從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)
方法,用於判定查詢集中是否包含給定的對象。它會嘗試以最簡單和最快的方式執行查詢。 -
其它更多小細節未一一列出
更多向后不兼容和廢棄功能的細節參考官方文檔,實在無法逐一列出。