如何使用 F() 表达式2024 年 8 月 29 日 | 阅读 3 分钟 在本教程中,我们将学习查询表达式、F 表达式以及如何在 QuerySet 中使用它。 让我们简要介绍一下查询表达式。 什么是查询表达式?查询表达式表示一个值或一个计算,它可以是更新、创建、筛选、排序、注解或聚合的一部分。 如果表达式以布尔值形式返回输出,则可以直接在过滤器中使用。 Django 提供了许多内置表达式,可以帮助我们编写查询。 查询表达式可以嵌套或组合。 Class F() 表达式F() 对象指定模型字段的值,或者直接引用数据库中的模型字段值。 让我们看一个简单的例子,一个Student类,其中包含 fees 字段,我们想要增加学生 20% 的费用。 可以如下完成。 我们可以使用 F() 表达式在单个查询中执行此操作。 我们也可以使用以下方法。 但是要注意这种赋值。 F() 对象在保存模型后仍然存在。 更新字段后,该特定字段将包含 django.db.models.expression.CombinedExpression 的实例,而不是实际结果。 我们可以立即按如下方式访问结果。 我们还可以使用数据的注解。 由于 fees 是 DecimalField 而 rollno 是 IntergerField,我们需要将表达式包装在 ExpressionWrapper 对象中。 它也可以用于过滤数据。 F() 表达式可以提供以下优势。
使用 F() 避免竞争条件F() 表达式还提供额外的功能,例如更新字段值可以避免竞争条件。 让我们更好地理解它 - 如果两个 Python 线程执行代码,一个线程可能会在另一个线程从数据库中检索字段的值之后检索、递增和保存字段的值。 线程保存的值将基于原始值。 将使用第一个线程的过程。 每次数据库参与更新字段时,该过程将变得更加健壮。 当执行 save() 或 update() 时,F() 表达式将基于数据库中字段的值更新该字段。 使用 F() 对空值进行排序我们可以使用 F() 和 nulls_first 或 nulls_last 关键字参数对 asc() 或 desc() 进行排序,以控制字段空值的排序。 让我们看下面的例子来对新学期后尚未支付费用的学生进行排序。 Func() 表达式Func() 表达式参与数据库函数,例如 COALESCE 和 LOWER 或聚合函数(如 SUM)。 我们可以直接使用它们。 示例 - 聚合表达式聚合表达式是 Func() 表达式的重要组成部分。 它通知查询需要 GROUP BY 子句。 所有聚合函数都继承自 Aggregate()。 示例 - Value() 表达式Value() 对象表示表达式的最小组成部分。 我们可以使用 Value() 表示表达式中的整数、布尔值或字符串值。 Value() 表达式很少直接使用。 当我们编写表达式 F('field') + 1 时,Django 会隐式地将 1 包装在 Value() 中,从而允许在更复杂的表达式中使用简单值。 value 参数自动将值包含在表达式中,这些值可以是 1、True 或 None。 Django 将这些 Python 值转换为其相应的数据库类型。 output_field 参数必须是模型字段实例,例如 IntegerField() 或 BooleanField()。 下一主题# |
我们请求您订阅我们的新闻通讯以获取最新更新。