代码之家  ›  专栏  ›  技术社区  ›  ilse2005

Django:根据另一行的值进行筛选

  •  0
  • ilse2005  · 技术社区  · 5 年前

    我有个模特 Foo 带着 value 现场。

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

    现在我要过滤所有 具有更大 具有特定knwon id的对象。

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

    问题是我能不能把上面的两个db查询合并成一个?

    0 回复  |  直到 5 年前
        1
  •  2
  •   willeM_ Van Onsem    5 年前

    您可以通过子查询来实现这一点,尽管我不确定这是否使它非常可读:

    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
    )
        2
  •  -1
  •   nigel222    5 年前

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

    我想说的是,保存一个DB查询通常不值得让代码变得不那么清晰。尤其是最简单的方法,通过id检索一个对象 values_list query ,这不会使代码变得晦涩难懂,只是时间更长)。

    (link) 通过比较一个对象中的一个字段与同一个或相关对象中的另一个字段进行过滤,但这里不是这样。

    推荐文章