序言:
这是 SO 中经常出现的问题:
- Subtracting two annotated columns
- Django query with simple arithmetic among model fields and comparison with field from another model
- Django Aggregation: Summation of Multiplication of two fields
也可以在这里应用:
我已经编写了一个关于 SO 文档的示例,但由于该文档将于 2017 年 8 月 8 日关闭,我将遵循 this widely upvoted and discussed meta answer 的建议并将我的示例转换为 self 回答的帖子。
当然,我也很乐意看到任何不同的方法!!
问题:
假设以下模型:
class MyModel(models.Model):
number_1 = models.IntegerField()
number_2 = models.IntegerField()
date_1 = models.DateTimeField()
date_2 = models.DateTimeField()
如何在这个模型的字段之间执行算术运算?
例如,我如何找到:
- MyModel 对象的
number_1
和number_2
的乘积? - 如何过滤
date_2
比date_1
早 10 天或更早的项目?
最佳答案
F()
表达式可用于在模型字段之间执行算术运算(+
、-
、*
等),以定义代数查找/它们之间的联系。
An
F()
object represents the value of a model field or annotated column. It makes it possible to refer to model field values and perform database operations using them without actually having to pull them out of the database into Python memory.
让我们来解决问题:
两个字段的乘积:
result = MyModel.objects.all().annotate(prod=F('number_1') * F('number_2'))
现在
result
中的每个项目都有一个名为“prod”的额外列,其中分别包含每个项目的number_1
和number_2
的乘积。按日差过滤:
from datetime import timedelta result = MyModel.objects.all().annotate( delta=F('date_2') - F('date_1') ).filter(delta__gte=timedelta(days=10))
现在
result
中的项目是来自MyModel
的项目,其date_2
比date_1
早 10 天或更多天.这些项目有一个名为delta
的新列,但有所不同。另一种情况:
我们甚至可以使用
F()
表达式对带注释的列进行算术运算,如下所示:result = MyModel.objects.all() .annotate(sum_1=Sum('number_1')) .annotate(sum_2=Sum('number_2')) .annotate(sum_diff=F('sum_2') - F('sum_1'))
关于python - 如何在django中的模型字段之间执行算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45593440/