Django:根据另一行的值进行过滤

我有一个Foo字段的模型value

# models.py

class Foo(models.Model):
    value = models.IntegerField()

现在,我想过滤所有Foo实例比具有特定知识ID的value对象更大的Foo实例。

pk = 10
obj = Foo.objects.get(pk=pk)
qs = Foo.objects.filter(value__gte=obj.value)

问题是我可以将上述两个数据库查询组合成一个吗?

wuxiuhao 回答:Django:根据另一行的值进行过滤

您可以使用子查询来执行此操作,尽管我不确定这是否使其易于阅读:

Foo.objects.filter(
    value__gte=Foo.objects.filter(pk=10).values('value')
)

这将导致查询如下:

SELECT *
FROM foo
WHERE foo.value >= (
    SELECT U0.value
    FROM foo AS U0
    WHERE id = 10
)
,

除了使用原始SQL(我没有能力编写)之外,我不认为可以。话虽如此,我完全希望有人能告诉我我错了。

我要说的是,通常不值得使代码不那么清晰以保存单个数据库查询。尤其是最简单的方法,即通过其ID检索一个对象。 (您可以通过将其更改为values_list query来减少数据库连接和Django服务器上的负载,这不会使代码晦涩,只是更长的时间。)

您可以使用F (link)进行过滤,方法是将对象中的一个字段与相同或相关对象中的另一个字段进行比较,但这不是这种情况。

本文链接:https://www.f2er.com/3153044.html

大家都在问