Django3.2新特性-主要变化总结

  • Post author:
  • Post category:其他



Django 3.2


的正式发布,将是Django 3系列的最后一个稳定版本,扩展支持会一直延续到2024年。对于学习Django和使用Django开发新项目的而言,还是直接上Django最新版本。


本篇介绍Django 3.2的主要变化。


参考资料:https://docs.djangoproject.com/en/dev/releases/3.2/





Python




版本兼容性





Django 3.2


支持Python 3.6, 3.7, 3.8和3.9。升级Django版本的同志们别忘了也升级下Python版本。





AppConfig




自动发现





Django 3.2


之前,如果对一个app修改了相应配置,应该将


app.apps.AppConfig


类加入到


INSTALLED_APP


中去,而不是直接添加app名。Django 3.2支持AppConfig名自动发现,这也就意味着如果不管以后是否修改一个app的配置,以后只需要在


INSTALLED_APP


中添加app名即可。





自动发现




AppConfig










在Django 3.1及之前版本中,如果将app名加入到


INSTALLED_APP


里并希望apps.py里的AppConfig配置类生效,



还需要修改




app




目录下的




__init__.py,




通过




default_app_config




手动指定




AppConfig




配置类



。Django 3.2以后,再也不用纠结



INSTALLED_APPS




中应该写




app




名,还是




AppConfig




子类了,两者将变得完全等同。




default_app_config




属性也将被删除。





定制自动创建主键类型





当定义一个模型的时候,如果没有使用


primary_key=True


指定一个主键,Django会自动为创建一个主键。Django 3.2之前默认使用的自增主键


AutoField


, Django 3.2


及以后将会默认使用


BigAutoField


。如果想依然使用


AutoField


,可以修改配置文件。

  • DEFAULT_AUTO_FIELD = ‘django.db.models.AutoField’


或者在app层面进行配置。

将BigAutoField 改为 AutoField即可





新增函数索引





这条非常有用。对于频繁查询的字段,建议在模型的


Meta


选项里定义


indexes


索引。Django 3.2将支持使用函数表达式创建索引。

from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper

class IndexModel(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_ids',
            ),
        ]





Admin




新增




@display









@actions




两个装饰器





在Django 3.2之前,如果要在admin中自定义display选项,可以通过点号. 设置排序字段及简短描述。

def is_published(self, obj):
    return obj.publish_date is not None
is_published.boolean = True
is_published.admin_order_field = '-publish_date'
is_published.short_description = 'Is Published?'


在Django 3.2以后,可以使用


@display


装饰器添加描述。

@admin.display(
    boolean=True,
    ordering='-publish_date',
    description='Is Published?',)
def is_published(self, obj):
    return obj.publish_date is not None


在Django 3.2之前,如果要在admin中自定义


actions


,可以通过点号. 设置所需的权限及简单描述。

def make_published(self, request, queryset):
    queryset.update(status='p')
    make_published.allowed_permissions = ['publish']
    make_published.short_description = 'Mark selected stories as published'


在Django3.2中,可以直接通过


@action


装饰器来给自定义action添加权限和描述。

@admin.action(
    permissions=['publish'],
description='Mark selected stories as published',
)
def make_published(self, request, queryset):
    queryset.update(status='p')





Python




兼容性





Django 3.2


版本将支持Python 3.6, 3.7, 3.8和3.9。连Python 3.5都不支持了。





对数据库的支持





Django 3.2


版本将放弃对MySQL 5.6, PostgreSQL 9.5及之前版本的支持。










pymemcache




的支持





新的


django.core.cache.backends.memcached.PyMemcacheCache


缓存后端允许将


pymemcache


库用于memcached。pymemcache需要3.4.0或更高版本。





智能分页





Django 3.2


之前的Paginator类将连续输出所有页码,非常不智能。Django 3.2新增


get_elided_page_range


方法。


Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2)


使用该方法将输出如下页码范围,更容易使用。


[1, 2, ‘…’, 7, 8, 9, 10, 11, 12, 13, ‘…’, 49, 50]





智能分页





Django


自带分页类将新增


get_elided_page_range


方法。可以通过


on_each_side





on_ends


选项,实现智能分页。




Paginator.get_elided_page_range






(

number

,

*

,

on_each_side=3

,

on_ends=2

)



当的页面数非常多时,不会像现在一样所有页码都会显示。新的分页自带缩略,显示效果如下:




[1, 2, '…', 7, 8, 9, 10, 11, 12, 13, '…', 49, 50]



不得不说,这个功能实在太香了。





其它微小变化





  • 新增对


    pymemcache


    的支持

  • autocompletefields


    支持


    limited_choices_to


    选项

  • 新增


    no_append_slash


    装饰器

  • 工具部分新增


    django.utils.timesince.timesince()





    django.utils.timesince.timeuntil()





    用于计算与当前时间差。


输入才有输出,吸收才能吐纳。——码字不易



更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。


关于公众号的描述访问如下链接





关于Articulate


“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技



https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q




版权声明:本文为zhouruifu2015原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。