想象一下以下模型:
class Car(models.Model):
colour = models.CharField(max_length=20)
doors = models.PositiveSmallIntegerField()
我想查询它,但我有一个我要排除的条件列表:
[(red, 4), (red, 5), (red, 6)]
结果是 - 例如 - 它将向我展示带有2扇门和任何蓝色汽车的红色汽车。我知道我可以迭代排除列表并将懒惰.exclude(color=..., doors=...)
打包在彼此之上,我只是想知道是否有更好的方式,如__in
修饰符,但可以成对地使用两个单独的字段。
答案 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])
但是,在实践中这样做可能不值得额外的工作。