Django3.2 新特性

Posted 大江东流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django3.2 新特性相关的知识,希望对你有一定的参考价值。

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_FIELDAppConfig.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时一行一行地处理数据,而不需要一次性将所有数据整体加载。

总结

没有什么重要的内容。版本号太激进了。

以上是关于Django3.2 新特性的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 新特性总结

ES7-Es8 js代码片段

Python__Django3.2框架

[译文]React v16(新特性)

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

Prometheus 2.17.0 新特性