Django:过滤另一行的值

Django: Filter against a value of another row

我有一个带有 value 字段的模型 Foo

# models.py

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

现在我想过滤所有 Foo 具有比具有特定 knwon id 的 Foo 对象更大 value 的实例。

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

问题是我能否以某种方式将上面的两个数据库查询合并为一个?

您可以使用子查询来执行此操作,但我不确定这是否会提高可读性:

Foo.objects.filter(
    value__gte=<b>Foo.objects.filter(pk=10).values('value')</b>
)

这将导致如下查询:

SELECT *
FROM foo
WHERE <b>foo.value >= (</b>
    SELECT U0.value
    FROM foo AS U0
    WHERE id = 10
<b>)</b>

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

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

您可以使用 F (link) 通过将对象中的一个字段与同一或相关对象中的另一个字段进行比较来进行过滤,但此处并非如此。