Django 4.0已经于2021年12月正式发布,标志着Django 4.X时代的来临。作为Django的忠粉们,你们准备新版本里令人激动人心的变化了吧? 去年一年非常忙,请原谅这篇迟到的文章。

Python兼容性

Django 4.0 将支持 Python 3.8、3.9 与 3.10。Django 3.2.x 会是最后一个支持 Python 3.7及之前版本的系列。

zoneinfo 成为默认的时区库

Python的标准库zoneinfo替代了过去的pytz库,成为Django的默认时区库。Django3.2是个过渡版本,可以使用非pytz的时区库。Django 4.0中,zoneinfo成为默认时区库。Django5.0以后pytz会被移除。

基于这个变化 django.utils.timezone.utc将变为datetime.timezone.utc.

定义模型时可以增加函数类唯一约束

UniqueConstraint() 新增了一个*expressions位置参数,可用于创建唯一性约束。定义模型时可以直接在Meta选项里使用唯一约束,如下所示:

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


新增Redis缓存后端

以前Django中使用redis都要安装django_redis,并将第三方库提供的django_redis.cache.RedisCache设置作为缓存后端。新版本内置了django.core.cache.backends.redis.RedisCache缓存后端,为直接使用 Redis 缓存提供了支持,但是需要 redis-py 3.0.0 或更高版本。

其它小变化

  • 新增了比 PBKDF2 算法更安全的scrypt 密码哈希算法;

  • 放弃了对Postgres SQL 9.6及之前版本的支持;

  • 新增QuerySet.contains(obj)方法,用于判定查询集中是否包含给定的对象;

  • LoginView增加了next_page属性;

  • {% ifequal %}和 {% ifnotequal %} 标签被删除;

  • request.is_ajax()方法被删除。

7cdf9f9f36bf5dd6ca77a55f90fa52c8.png

Django版本升级很快,你还在用哪个版本呢? 欢迎留言!

大江狗

推荐阅读

Django 3.2正式发布! 主要变化抢先看!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐