仅当查询集中有另一个对象时,才从筛选集中筛选出对象

时间:2016-07-20 03:37:16

标签: django django-queryset

考虑一个非常简单的模型:

class Thing(models.Model):
    attribute = models.IntegerField(choices=[1,2,3])

我想要所有的东西,除了那些属性= 2的东西 但是如果结果集中没有包含2的属性的东西,我确实想要这些属性= 2。

如何通过单个查询获得此结果?

[编辑]
实际上我只需要第一个Thing属性不同于2,或者第一个属性为2,如果这是唯一可用的东西。

我已经能够通过

功能实现这一目标
def get_thing():
    things_per_attribute = [
        Thing.objects.filter(attribute=value)
        for value in [1, 3, 2]
    ]
    for thing in things_per_attribute:
        if thing.count() > 0:
            return thing[0]
    return None

我仍然有兴趣看看是否有人可以提出1查询解决方案。

1 个答案:

答案 0 :(得分:1)

一个查询:

from django.db.models import BooleanField, Case, When

Thing.objects.annotate(
    attribute_is_two=Case(
        When(attribute=2, then=True),
        default=False,
        output_field=BooleanField()
    ),
).order_by('-attribute_is_two').first()

两个问题:

def get_thing():
    thing = Things.objects.exclude(attribute=2).first()
    if thing:
         return thing
    return Thing.objects.first()