我正在使用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)
如何编写这个更复杂的查询?
答案 0 :(得分:2)
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供进一步参考
答案 1 :(得分:0)
您可以在查询集中注释数学表达式的值,然后按该注释值进行过滤:
DomainTrackerStat.objects.annotate(value=F('num_negative_articles') / (F('num_negative_articles ') + F('num_positive_articles'))).filter(value__gt=0.95)