2021年4月6日正式发布了Django 3.2!这是一个长支持版本,至少有3年的维护期。
而上一个长支持版本Django2.2将在2022年4月结束支持。
Django 3.2支持Python 3.6, 3.7, 3.8, 3.9或者更高版本。
Django 3.2只支持MySQL 5.7,或更高版本。对于MySQL 5.6的支持在 2021年4月到期。
Django 3.2只支持PostgreSQL 9.6,或更高版本。
自动发现AppConfig
以往,大多数可插拔的app应用中,都在apps.py文件中定义了一个AppConfig类。
大多数人都不知道apps.py的功能和用法,更不知道可以在根目录下的__init__.py
中定义一个default_app_config
变量指向AppConfig类。这个指向是一个钩子,可以在初始化app的时候,自动调用我们定义的一些代码。
现在,我们不需要这么麻烦了,只要你在任何应用的apps.py文件中定义了一个AppConfig类,Django会自动发现,并调用它,不需要再编写default_app_config
变量了,它也被废弃了。
我们也不用纠结在INSTALLED_APPS
中写app的名字,还是AppConfig子类名了,因为两者一样。
自动创建的主键的类型发生变化
当你编写一个模型的时候,如果你没有定义一个带有primary_key=True
属性的主键字段,Django会帮你自动创建一个,也就是id字段。这个自动创建的字段类型可以通过 DEFAULT_AUTO_FIELD
和AppConfig.default_auto_field
属性进行预定义。
为了向后兼容,Django3.2之前,这个自动创建的主键的类型,默认被设置为AutoField
,但是Django3.2之后,官方将它改为 BigAutoField
了。
为了防止过去的代码和新版本Django之间的冲突,你可以如下显式地设置,使其依然使用AutoField
:
全局级别配置:
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
app级别配置:
from django.apps import AppConfig
class MyAppConfig(AppConfig):
default_auto_field = 'django.db.models.AutoField'
name = 'my_app'
模型级别指定:
from django.db import models
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
函数式索引
Index()
新增 *expressions
位置参数 ,可以为表达式创建函数类型的索引。
具体方法是在模型的Meta类中添加indexes选项。
比如:
from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper
class MyModel(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
height = models.IntegerField()
weight = models.IntegerField()
class Meta:
indexes = [
Index(
Lower('first_name'),
Upper('last_name').desc(),
name='first_last_name_idx',
),
Index(
F('height') / (F('weight') + Value(5)),
name='calc_idx',
),
]
支持pymemcache
新的 django.core.cache.backends.memcached.PyMemcacheCache
缓存后端,支持使用 pymemcache库。但是需要 pymemcache
3.4.0或更高版本
admin后台新增两个装饰器
也就是:
-
@display()
装饰器:其功能和list_display
或者readonly_fields
一样 -
@action()
装饰器:类似原来的actions属性。
在某些场景下,使用装饰器比直接使用属性更方便。
小功能
- admin后台开始支持外观主题
- auth的PBKDF2密码哈希迭代次数又提高了,盐的长度也提高到了128位
-
loaddata和dumpdata管理命令现在支持XZ和LZMA格式
-
现在不需要活动的数据库连接,就可以执行makemigrations命令了。
-
新增
django.core.paginator.Paginator.get_elided_page_range()
方法,允许生成一个页面范围,其中一些值会 被省略。如果你的页面数量比较大,那么这个方法有助于在模板中生成合理数量的页面链接。 -
新增响应头部属性
HttpResponse.headers
,未来用于替代HttpResponse
本身。目前两者共存,作用相同。 -
对于
SECRET_KEY
这个settings.py中最重要的安全配置,不再是第一次加载时进行检查,而是在第一次访问时检查。这有助于运行一些不依赖于SECRET_KEY
的管理命令。但是在没有提供SECRET_KEY
的情况下,调用configure()方法后,如果你发生对settings.SECRET_KEY
的访问,将弹出ImproperlyConfigured
异常。 -
新增JSONL序列化器。用于在dumpdata和loaddata时一行一行地处理数据,而不需要一次性将所有数据整体加载。
总结
没有什么重要的内容。版本号太激进了。