【问题标题】:How to execute arithmetic operations between Model fields in django如何在 django 中的模型字段之间执行算术运算
【发布时间】:2018-01-17 12:09:12
【问题描述】:

序幕:

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

而且这里也可以应用:

我已经编写了一个关于 SO 文档的示例,但由于文档将于 2017 年 8 月 8 日关闭,我将按照this widely upvoted and discussed meta answer 的建议将我的示例转换为自我回答的帖子。

当然,我也很乐意看到任何不同的方法!


问题:

假设以下模型:

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 天或更长时间的项目?

【问题讨论】:

    标签: python django


    【解决方案1】:

    F() 表达式可用于在模型字段之间执行算术运算(+-* 等),以定义它们之间的代数查找/连接。

    F() 对象表示模型字段或注释列的值。它可以引用模型字段值并使用它们执行数据库操作实际上不必将它们从数据库中拉出到 Python 内存中。

    让我们来解决问题:

    • 两个领域的乘积:

      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 中的项目是来自MyModeldate_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')) 
      

    【讨论】:

    • 如果有人遇到问题:from django.db.models import F
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2013-04-16
    • 2023-01-11
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多