从Django查询集中排除条件对列表

时间:2015-06-24 13:17:19

标签: django django-queryset

想象一下以下模型:

class Car(models.Model):
    colour = models.CharField(max_length=20)
    doors = models.PositiveSmallIntegerField()

我想查询它,但我有一个我要排除的条件列表:

[(red, 4), (red, 5), (red, 6)]

结果是 - 例如 - 它将向我展示带有2扇门和任何蓝色汽车的红色汽车。我知道我可以迭代排除列表并将懒惰.exclude(color=..., doors=...)打包在彼此之上,我只是想知道是否有更好的方式,如__in修饰符,但可以成对地使用两个单独的字段。

1 个答案:

答案 0 :(得分:0)

queryset = Car.objects.all()
exclude_conditions = [(red, 4), (red, 5), (red, 6)]
for colour, doors in exclude_conditions:
    queryset = queryset.exclude(colour=colour, doors=doors)

或者,您可以为列表中的每个条件构建Q()个对象的列表,并将or组合在一起:

from operator import or_

queryset = Car.objects.all()
exclude_conditions = [(red, 4), (red, 5), (red, 6)]
exclude_qs = [Q(colour=colour, doors=doors) for (colour, doors) in exclude_conditions]
queryset = queryset.filter(reduce(or_, exclude_qs))

您选择哪一个实际上是个人偏好的问题。

对于您提供的示例,您可以将查询简化为

queryset = Car.objects.exclude(Q(colour="red", doors__in=[4, 5, 6])

但是,在实践中这样做可能不值得额外的工作。