我正在尝试进行相当复杂的查询,我可以排除符合某些条件的项目。这是一个超简化的模型来解释我的困境:
class Thing(models.Model)
user = models.ForeignKey(User)
shared = models.BooleanField()
number = models.IntegerField()
我从一个按用户过滤的查询集开始:
qs = Thing.objects.filter(user=request.user)
现在,从那个Thing列表中,我想排除任何项目:
[1, 6, 7]
。在我脑海里,我会这样做:
qs = qs.exclude(shared=True, number__not__in=[1, 6, 7])
但__not__in
不存在,是吗?我觉得我需要摇晃这个以交叉两个查询,但这对于那些 复杂的事情感到恶心。我最好的前进方向是什么?
答案 0 :(得分:4)
根据有关op的IRC的讨论,可能是
qs = qs.exclude( Q ( shared = True ) && ~ Q ( number__in=[1,6,7] ) )
答案 1 :(得分:1)
~Q
这会让我进行非查询,然后我可以按shared=True
:
qs = qs.exclude(~Q(number__in=[1, 6, 7]), shared=True)