【问题标题】:How do I write a Django query where the left side of my WHERE condition is a math expression?如何编写 Django 查询,其中 WHERE 条件的左侧是数学表达式?
【发布时间】:2019-04-08 15:38:14
【问题描述】:

我正在使用 Django、Python 3.7 和 PostGres 9.5。我有一个具有以下字段的模型...

class DomainTrackerStat(models.Model):
    domain = models.CharField(max_length=255)
        ...
    num_negative_articles = models.IntegerField(default=0, null=False)
    num_positive_articles = models.IntegerField(default=0, null=False)

我想写一个 Django 查询,告诉我所有条件匹配这个 PostGres WHERE 子句的对象

WHERE num_negative_articles / (num_negative_articles + num_positive_articles) > .95

但是我在编写 Django 查询表达式时遇到了麻烦,因为通常它只允许单个字段,例如

DomainTrackerStat.objects.filter(num_negative_articles__gt=.95)

如何编写这个更复杂的查询?

【问题讨论】:

  • 过滤前注释

标签: python sql django python-3.x where


【解决方案1】:

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

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

data = DomainTrackerStat.objects.annotate(result=F('num_negative_articles') / (F('num_negative_articles') + F('num_positive_articles'))).filter(result__gt=0.95)

现在数据中的每个项目都有一个名为“结果”的额外列,其中包含“num_positive_articles”和“num_negative_articles”分别除以每个项目的“num_negative_articles”的乘积。

Documentation供进一步参考

【讨论】:

    【解决方案2】:

    您可以在查询集中注释数学表达式的值,然后按该注释值进行过滤:

    DomainTrackerStat.objects.annotate(value=F('num_negative_articles') / (F('num_negative_articles ') + F('num_positive_articles'))).filter(value__gt=0.95)
    

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 2016-11-09
      • 2021-12-02
      • 2013-12-30
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多