python - 如何在django中的模型字段之间执行算术运算

标签 python django

序言:

这是 SO 中经常出现的问题:

也可以在这里应用:

我已经编写了一个关于 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_1number_2 的乘积?
  • 如何过滤 date_2date_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_1number_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_2date_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/

相关文章:

python - Django 过滤器。什么更有效 - .filter(date__range) 或 .all() 并通过 Python 进行过滤

python - Django web frame实时数据

Django 1.8 迁移。在创建数据库后添加 DateTimeField。最佳实践?

python - 如何在 tkinter 中创建 4 个方 block ,使它们从屏幕中间开始,每个方 block 进入自己的角落并消失?

python - 如何使用 pandas 计算数据框中每个日期的值?

python - 如何将此日期转换为 python 日期时间对象?

django - ShimmerCat - 使用 ShimmerCat 作为 Django 应用程序的反向代理

python - Django 中的模板标签过多是否不好?

python - 学习 Python : Changing value in list based on condition

python - 如何从 Django 中的多对多中间模型中进行选择?