本文介绍: 你好,我是 EarlGrey,一名双语学习者,会一点编程,目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍点击上方蓝字关注我,获取最新编程及AI干货、高赞工具项目分享。在后台回复books”,即可领取超值优质电子书合集。11月20日,Django团队博客发布了 Django 5.1rc1版本,这是5.0正式版发布最后一个版本等待译者们提交翻译即可发布。…

你好,我是 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 Felisiakfly.io 上发布的博文原文地址文末)。

数据库生成字段 Generated Fields

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

Django 5.0 带来了这些需求答案— GeneratedField

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

假设我们有一些经常连在拼接使用的字段,如 first_namelast_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 里添加注释可以实现共享模型对象常用计算值:

pythonmanage.py shell
>>> from order.modelimport 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 noavailable 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 nopermitted.

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

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

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

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

frodjango.db import models
frodjango.db.models.functionimport 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 thsamlogic anymore!
        return self.full_name

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

数据库计算的默认值

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

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

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

frodecimal import Decimal

frodjango.db import models
frodjango.db.models.functionimport 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="helpid="{{ field.auto_id }}_helptext">
      {{ field.help_text|safe }}
    </p>
  {% endif %}
  {{ field.errors }}
  {{ field }}
</div>

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

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

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

总结

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

原文https://fly.io/djangobeats/new-goodiesindjango-50/

***

– EOF –

推荐阅读  点击标题跳转

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

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

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

4、高效的终极秘诀

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

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

原文地址:https://blog.csdn.net/codingpy/article/details/134609357

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_40642.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注