Django 5.0 即将发布!关键新特性一览

Django 5.0:您等待的 3 个功能将于 2023 年 12 月公开 Django 是一部诞生于昆汀·塔伦蒂诺 (Quentin Tarantino) 头脑中的精彩西部电影,其灵感并非来自基于 Python 的同名 Web 框架。它最初发布于 17 年前的 2005 年。那一年对人类来说是艰难的一年,但发生了一些重要的事情。YouTube 诞生了。签署京都议定书并举行Live 8音乐会。Django 也是2005 年的婴儿,17 年后它成为使用 Python 构建的 Web 应用程序的黄金标准。别忘了订阅! 阅读详情

你好,我是 EarlGrey,一名双语学习者,会一点编程,目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。

点击上方蓝字关注我,获取最新编程及AI干货、高赞工具和项目分享。

在后台回复“books”,即可领取超值优质电子书合集。

11月20日,Django团队在博客上发布了 Django 5.1rc1版本,这是5.0正式版发布前最后一个版本,等待译者们提交翻译后即可发布。预计正式发布时间为12月4日,仅剩一周多一点的时间。

如果你现在就想尝鲜的话,可以通过 pip 进行安装:

pip install --pre django

安装时请注意,Django 5.0 仅支持3.10以上的版本。

据团队成员Mariusz Felisiak介绍,Django 5.0的首个版本共合并了接近700个commit,有204位开发者参与版本开发。

新版本带来了很多令人兴奋的新特性,让我们一起来了解一下吧。


以下新特性的介绍,来自 Django 团队成员 Mariusz Felisiak 在 fly.io 上发布的博文(原文地址见文末)。

数据库生成字段 Generated Fields

多年来,Django 开发人员一直在纠结以下问题:

  • 在哪里保存基于模型对象的可复用属性?

  • 如何在所有 Django 组件中使用它们?

Django 5.0 带来了这些需求的答案-- GeneratedField!

它允许创建数据库生成的字段,其值总是由数据库本身根据其他字段计算得出。数据库表达式和函数也可用于即时进行必要的修改。让我们来看看它在实际中是如何工作的。

假设我们有一些经常连在拼接使用的字段,如 first_name 和 last_name。在 5.0 以下版本中,最佳的选择是自定义实现模型的 QuerySet 或 Manager 管理器。

from django.db import models
from django.db.models.functions import Concat


class Order(models.Model):
    person = models.ForeignKey("Person", models.CASCADE)
    ...


class PersonQuerySet(models.QuerySet):
    def with_extra_fields(self):
        return self.annotate(
            full_name=Concat(
                "first_name", models.Value(" "), "last_name",
            ),
        )


class Person(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

    objects = PersonQuerySet.as_manager()

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

在自定义的 QuerySet 里添加注释,可以实现共享模型对象的常用计算值:

python3 manage.py shell
>>> from order.models import Order, Person
>>> Person.objects.with_extra_fields().filter(full_name="Joe Doe")
<PersonQuerySet [<Person: Joe Doe>]>
>>> mark = Person.objects.with_extra_fields().get(full_name="Mark Doe")
>>> mark.full_name
'Mark Doe'
# It's not available on relationship :(
>>> Order.objects.filter(person__full_name="Catherine Smith")
    ...
    raise FieldError(
django.core.exceptions.FieldError: Unsupported lookup 'full_name'
for ForeignKey or join on the field not permitted.

不过,QuerySet 注释也有局限性。首先,full_name 只适用于从 .with_extra_fields() 方法返回的对象,因此我们必须记住使用它。模型方法中的 self 实例也不能使用它,因为它不是 Person 属性。例如,它不能用于 Person.str()。此外,每次都要计算值,这对于复杂的计算来说可能是个问题。

GeneratedField 使基于其他字段的值的提供变得真正无缝。每次使用给定的数据库表达式更改模型时,它的值都会自动设置。此外,还可以使用 db_persist 参数决定是否存储该值:

  • db_persist=True:表示存储这些值,并像其他普通列一样占用存储空间。另一方面,只有在值发生变化时才会计算这些值,因此我们可以避免在获取数据时进行额外的计算。在某些数据库(MySQL、Postgres、SQLite)中,它们甚至可以被编入索引!

  • db_persist=False: 表示列不占用存储空间,但每次都会计算其值。

数据库对使用不同表达式和选项的支持可能有所不同。例如,Postgres 不支持虚拟列,因此 db_persist 必须设置为 True。SQLite 和 MySQL 同时支持虚拟字段和存储生成字段。

回到我们的 "full_name "示例。在 Django 5.0 中,我们可以摆脱之前方法的所有弊端,用 full_name 注解中使用的表达式定义一个 GeneratedField:

from django.db import models
from django.db.models.functions import Concat


class Order(models.Model):
    person = models.ForeignKey("Person", models.CASCADE)
    ...

class Person(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    # ↓ Our new GeneratedField based on an expression ↓
    full_name = models.GeneratedField(
        expression=Concat(
            "first_name", models.Value(" "), "last_name"
        ),
        output_field=models.CharField(max_length=511),
        db_persist=True,
    )

    def __str__(self):
        # There is no need to re-implement the same logic anymore!
        return self.full_name

现在,full_name 是一个正常的 Person 属性,可以像其他字段一样在所有 Django 组件中使用。

数据库计算的默认值

数据库计算的默认值是在数据库中完全表达 Django 模型结构和关系的最后一个重要障碍。在 Django < 5.0 版本中,Field.default 是为字段设置默认值的唯一选项,但它是在 Python 端计算的,并在添加新行时作为参数传递。因此,从数据库结构的角度来看,它是不可见的,直接在数据库中添加行时也无法设置。

如果考虑到数据库和网络延迟,这也会造成数据不一致的风险,例如,当我们想默认为当前时间点时。此外,对于只能直接访问数据库的人员(如数据库管理员或数据科学家)来说,这也是不可见的。

Django 5.0 通过新的 Field.db_default 选项支持数据库计算的默认值。这是解决与之前方法相关的所有问题的灵丹妙药,因为它允许我们在数据库中定义和计算默认值。它接受字面值和数据库函数。让我们来看一个实际例子:

from decimal import Decimal

from django.db import models
from django.db.models.functions import Now


class Order(models.Model):
    person = models.ForeignKey("Person", models.CASCADE)
    created = models.DateTimeField(db_default=Now())
    priority = models.IntegerField(db_default=0)
    ...

表单字段组渲染

第三个值得一提的重要特性是 Django 5.0 引入的表单字段组渲染概念,这使得表单字段的渲染变得更加简单和可复用。

表单字段通常会伴随着许多相关的属性进行渲染,如帮助文本、标签、错误信息和小部件。每个项目都有自己的 HTML 结构和首选的表单字段渲染方式。假设我们使用基于 <div> 的字段模板(像 Django 那样)来帮助使用辅助技术的用户(例如屏幕阅读器)。我们首选的字段渲染方式可能看起来是这样的:

<div class="form-field">
  {{ field.label_tag }}
  {% if field.help_text %}
    <p class="help" id="{{ field.auto_id }}_helptext">
      {{ field.help_text|safe }}
    </p>
  {% endif %}
  {{ field.errors }}
  {{ field }}
</div>

它与 Django 新增加的 .as_field_group() 方法的默认模板完全相同,因此现在我们可以将其简化为:

<div class="form-field">{{ field.as_field_group }}</div>

.as_field_group() 默认使用 "django/forms/field.html "模板,该模板可按项目、字段或请求进行自定义。这给了我们很大的灵活性。

总结

除了本文介绍的三项重大新特性外,Django 5.0 还在可访问性和异步方面进行了改进。建议大家直接访问官网了解详情。

原文:https://fly.io/django-beats/new-goodies-in-django-50/

***

- EOF -

推荐阅读  点击标题可跳转

1、VS Code 变身小霸王游戏机!

2、认知升级:模型与范式转换

3、超赞的 Python 编译器,单核提速100倍

4、高效的终极秘诀

5、Python 3.12 版本有什么变化?


                                           分享、在看、点赞,3连0a264a26d4f20514e9bc8637e18cdf07.gif

Labview程序框架介绍 当掌握LabVIEW基础知识并达到,理解单个小型模块程序会相对轻松。而若想进一步探索大型程序,就必然需要了解程序框架相关内容。LabVIEW常用的程序架构包括等。在多年工作中,我接触过的众多高级工程师所开发的大型程序,基本都基于这些架构搭建。接下来,将为大家详细介绍这些框架。 阅读详情

相关推荐

10.2 构网型变流器引发的次同步振荡与宽频振荡问题:机理分析与抑制技术

随着构网型变流器在新型电力系统中的规模化部署,其作为电压源主动支撑电网的能力得到验证的同时,也引发了一系列前所未有的稳定性问题。传统的同步发电机主导的电力系统中,振荡模式主要集中于**低频区间**。然而,构网型变流器通过快速数字控制实现的虚拟同步、惯性响应等先进功能,其控制环路动态与电网阻抗、其他电力电子设备之间产生了复杂的交互作用。这种交互不仅可能诱发经典的**次同步振荡**,更可能催生频率范围从数赫兹到数百赫兹甚至上千赫兹的**宽频振荡**。

技术工作者 1306

Django指令和配置文件

创建新文件以及配置虚拟环境 1. 简介 Django,发音为[`dʒæŋɡəʊ],是用python语言写的开源web开发框架,并遵循MVC设计。劳伦斯出版集团为了开发以新闻内容为主的网站,而开发出来了这个框架,于2005年7月在BSD许可证下发布。这个名称来源于比利时的爵士音乐家DjangoReinhardt,他是一个吉普赛人,主要以演奏吉它为主,还演奏过小提琴等。由于Django在近年来的迅速发展,应用越来越广泛,被著名IT开发杂志SDTimes评选为2013SDTimes100,位列"API、库和框架"

qq_42181333的博客 1449

海康机器人ID5000 系列智能读码器(三)

又過了兩個月,漸漸的對這個攝像頭的功能更加熟悉了,而實際上,我要做的功能也越來越複雜,從一開始的讀碼,到後來的通過讀二維碼控制設備,再到未讀到二維碼控制設備等,下面就對具體的細項做一個總結。了解完這些就能對ID5000這個設備,乃至很多海康的設備都能做一個二次開發。

qq_54359036的博客 3073

Python框架Django入门教程

Django入门教程,项目创建启动,使用Django进行增删改查

凡梦千华的博客 1万+

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 447

EMC基础知识总结

电磁干扰(Electromagnetic Interference),简称EMI,有和两种。传导干扰主要是电子设备产生的干扰信号通过导电介质或公共电源线互相产生干扰;辐射干扰是指电子设备产生的干扰信号通过空间耦合把干扰信号传给另一个电网络或电子设备。

学海无涯的专栏 1368

Django 5.0解析:最新功能和特色的综合指南-2023 年 12 月的完美礼物

祝福大家!随着 2023 年底的临近,我们有一些令人难以置信的消息要分享。Django 5.0 即将推出,这不是普通的更新。此版本标志着一次重大飞跃,肯定会让所有 Django 爱好者兴奋不已,他们将其视为首选的基于 Python 的 Web 框架。就像提前收到一份意想不到的节日礼物!将 Django 5.0 视为熟悉的 Django 4.0 的颠覆性升级。它为我们的网络开发工具库中本已不可或缺的...

Python数据之道 2251

AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

django的入门

django的安装使用

sovereign_jun的博客 6351

C# WPS操作PPT,全屏,缩率图,备注,跳转播放

本文介绍了一个使用C#开发的PPT操作工具,主要功能包括检测当前打开的PPT文件、获取选中PPT路径、指定播放PPT、获取PPT页面序号和缩略图、提取备注内容等。文章展示了操作界面效果图,并重点解决了用户手动退出PPT后重新获取路径时报错的问题。核心代码实现了通过WPS API进行PPT文件的打开、全屏播放、页面跳转、获取当前页位置等功能,同时支持生成PPT缩略图预览和备注信息提取。当用户未通过工具按钮打开PPT时,程序会自动初始化PPT信息确保功能正常使用。

遇见--专栏 311

微信小程序、H5微信公众号网页JSAPI:解决报错requestMerchantTransfer:fail:internal error(使用wx.requestMerchantTransfer错误)

如何解决requestMerchantTransfer:fail:internal error,微信小程序wx.requestMerchantTransfer报错,微信公众号H5网页使用jssdk调用wx.requestMerchantTransfer报错,JSAPI调起用户确认收款报错errMsg:“requestMerchantTransfer:fail:internal error“,微信小程序/H5 调起确认收款界面,JSAPI调起用户确认收款,微信公众号(H5),用户发起提现,商家转账给用户,用户

✅ 精选推荐文章 4968

Django5.0新特性解析全方位提升开发效率与性能

总体而言,Django 5.0通过一系列精心设计的新特性和优化,在开发效率和运行时性能两个关键维度上都实现了显著提升。从数据库层面的默认值处理和计算字段,到模板渲染的简化,再到异步支持的成熟和测试的提速,每一项改进都直指开发过程中的痛点。对于希望保持技术栈现代性并追求更高应用性能的开发团队而言,升级至Django 5.0无疑是一个明智的选择,它将帮助开发者以更少的代码、更快的速度构建出更加强健和高效的Web应用程序。

jianxun12345的博客 1033

麒麟v10系统安装

麒麟v10系统安装

喜文BLOG 1万+

django2.0支持python版本_Django 2.0版本的新特性抢先看!

前言2017年12月2日,Django官方发布了2.0版本,成为多年来的第一次大版本提升,那么2.0对广大Django使用者有哪些变化和需要注意的地方呢?一、Python兼容性Django 2.0支持Python3.4、3.5和3.6。Django官方强烈推荐每个系列的最新版本。最重要的是Django 2.0不再支持Python2!Django 1.11.x是支持Python2.7的最后版本。二、...

weixin_36200896的博客 340

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Django4.0新特性-主要变化

Django 4.0 release notes

SteveRocket's-Blog 2126

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Django 5.0 发布:经典 Web 框架还能继续统治市场吗?

``html Django 5.0 发布:经典 Web 框架还能继续统治市场吗?

jkgfjkfgj的博客 315

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python3.0什么时候发布的_Django 3.0 发布说明

Python兼容性Django 3.0 仅支持Python 3.6, 3.7和3.8,而且仅支持每个系列里的最新版本。而Django 2.2.x是最后的支持Python 3.5的版本。Django官方已经建议第三方应用开发者放弃兼容Django2.2之前的版本,并给出了操作指南。Django 3.0的新特性支持MariaDB Django现在官方支持MariaDB 10.1及以上版本2. 支...

weixin_35717340的博客 619

Django-Postgres-Extra与Django 5.x兼容性:新特性与升级指南

在PostgreSQL的强大功能与Django ORM之间架起桥梁,django-postgres-extra项目为开发者提供了无缝集成PostgreSQL高级特性的能力。随着Django 5.x系列的发布,这个强大的扩展库也迎来了全面的兼容性升级。本文将详细介绍django-postgres-extra在Django 5.x环境下的新特性、兼容性改进以及升级指南,帮助您充分利用PostgreSQ

gitblog_00775的博客 1060

Django5.0新特性前瞻探索ORM与异步视图的融合之道

随着Django 5.0的发布,其异步支持能力得到了显著的增强,特别是在核心的ORM(对象关系映射)与视图层。目前,ORM的某些复杂操作,尤其是涉及复杂事务管理和跨多个查询的原子性操作,其异步支持可能仍未完全成熟。视图可以异步地等待特定数据库条件的满足(例如,使用异步信号或结合数据库的监听功能),然后立即向客户端推送响应,实现了更高效的实时数据流。Django 5.0致力于突破这一瓶颈,推动ORM的异步化。在Django 5.0的异步视图中,混合使用同步和异步ORM调用需要格外小心,以免意外阻塞事件循环。

qq_33836401的博客 951

Django5.0新特性解析AsyncORM的革新与实战

Django 5.0的AsyncORM是框架演进历程中的一个重要里程碑,它使Django能够更好地适应现代Web应用对高并发和实时性的需求。通过本文的解析与实战演示,我们可以看到AsyncORM不仅提供了强大的异步数据库操作能力,还保持了Django一贯的开发者友好特性。随着异步生态的进一步完善,AsyncORM必将成为构建下一代高性能Django应用的核心利器。未来,我们期待看到更多异步特性的加入,如异步模型方法、异步信号处理器等,进一步丰富Django的异步开发生态。

qq_19431345的博客 759

Django5.0新特性解析全面支持异步视图与性能大幅提升

Django 5.0 标志着该框架的一个重要里程碑,其最核心的改进之一是提供了对异步视图的全面支持。它使开发者能够更容易地构建高性能的Web应用,充分利用现代Python的异步特性,为应对高并发挑战提供了强大的工具。在这些场景下,与传统同步模式相比,异步Django应用能够以更少的服务器资源支撑更高的并发量,响应时间也更加稳定。在Django 5.0之前,虽然已经引入了对异步服务器网关接口(ASGI)的支持,并允许定义异步中间件和测试客户端,但视图层的异步支持尚不完整。届时,开发者将能够直接使用。

郭正阳 495

Django5.0新特性解析异步视图与表单验证的实战应用

Django 5.0的异步视图为处理高I/O并发场景提供了强大的工具。然而,在与传统的同步组件如表单系统结合时,开发者需要谨慎处理。核心要点是确保任何在异步视图中发生的数据库访问都通过异步ORM API完成。对于现有的同步表单代码,使用`sync_to_async`适配器是当前最实用的集成方法。随着Django对异步支持的不断演进,未来我们有望看到更多原生支持异步的核心组件,使异步编程在Django生态中更加无缝和强大。在现阶段,评估需求、合理选择同步与异步模式,才是构建稳健Django应用的关键。

qq_19431345的博客 843

Django5.0新特性解读全面拥抱异步视图与性能飞跃

Django 5.0对异步视图的全面支持不仅是技术上的重要更新,更代表了框架面向未来Web开发趋势的战略方向。它降低了开发者构建高性能、可扩展Web应用的门槛,使Django在云原生和微服务架构时代保持了强大的竞争力。虽然完全异步化的生态系统仍在演进中,但Django 5.0无疑为社区开启了一扇新的大门,鼓励开发者探索和实践异步编程模式,以迎接下一代Web应用的挑战与机遇。

WJ19890301的专栏 384

Django 3.0 ASGI

asgi

蜗牛专栏 1494

Django 3.0 ASGI 指南及其性能

2019 年 12 月,Django3.0发布,它具有一个有趣的新特性——支持 ASGI 服务器。我对这特性非常感兴趣。当我检查 Python Web 异步框架的性能时,我发现它的性...

Oner.wv的专栏 7391

Python三大web框架,Django 6.0来了!

其实对于我这种老Django用户来说,看到这个框架20年了还在不断进化,还是挺欣慰的。作为一个用了十几年Django的老Python程序员,当我看到Django 6.0发布的消息时,心里还是挺激动的。说实话,以前每次要做个后台任务,比如发邮件、生成报表啥的,都得上Celery。别误会,Celery是个好东西,但对于一些小项目来说,配置一套Celery+Redis实在是杀鸡用牛刀。Django 6.0这次更新可以说是诚意满满,Tasks框架解决了小项目的痛点,CSP支持提升了安全性,模板片段让代码更优雅。

cainiao_python的博客 518
上一篇: 千万不要装这5款流氓软件,中招的赶紧卸载
下一篇: 读书笔记 | 爆款文案的内在逻辑
codingpy
博客等级 码龄11年 1870粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值