Django 做一个;不在「;查询

Django 做一个;不在「;查询,django,django-models,django-queryset,Django,Django Models,Django Queryset,我试图做一个相当复杂的查询,在这里我可以排除符合特定条件集的项。下面是一个超级简化的模型来解释我的困境: class Thing(models.Model) user = models.ForeignKey(User) shared = models.BooleanField() number = models.IntegerField() 我从按用户筛选的查询集开始: qs = Thing.objects.filter(user=request.user) 现在,从

我试图做一个相当复杂的查询,在这里我可以排除符合特定条件集的项。下面是一个超级简化的模型来解释我的困境:

class Thing(models.Model)
    user = models.ForeignKey(User)
    shared = models.BooleanField()
    number = models.IntegerField()
我从按用户筛选的查询集开始:

qs = Thing.objects.filter(user=request.user)
现在,从这个列表中,我想排除以下任何项目:

  • 共享是真的,
  • 数字不是
    [1,6,7]
    中的任何值
在我的脑海里,我会:

qs = qs.exclude(shared=True, number__not__in=[1, 6, 7])

但是
\uuuu not\uu in
不存在,是吗?我觉得我需要在两个查询之间来回切换,但这让我觉得有些事情并不那么复杂。我最好的前进方向是什么?

根据与op在IRC上的讨论,可能是

qs = qs.exclude( Q ( shared = True ) && ~ Q ( number__in=[1,6,7] ) )
~Q
这将允许我执行not查询,然后我可以通过
shared=True
对其进行过滤:

qs = qs.exclude(~Q(number__in=[1, 6, 7]), shared=True)

我不确定你是否能在同一个地方把一个Q表达式和一个非Q表达式结合起来filter@karthikr你可以,但是任何Q组都必须先去。