2

我正在尝试进行相当复杂的查询,我可以在其中排除符合特定条件的项目。这是一个超级简化的模型来解释我的困境:

class Thing(models.Model)
    user = models.ForeignKey(User)
    shared = models.BooleanField()
    number = models.IntegerField()

我从一个按用户过滤的查询集开始:

qs = Thing.objects.filter(user=request.user)

现在,从该事物列表中,我想排除以下任何项目:

  • shared 是 True,并且
  • number不是任何值[1, 6, 7]

在我的脑海中,我会这样做:

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

__not__in不存在,不是吗?我觉得我需要左右晃动以使两个查询相交,但这对于不可能那么复杂的事情感到恶心。我最好的前进方式是什么?

4

2 回答 2

4

根据关于 IRC 与 op 的讨论,可能是

qs = qs.exclude( Q ( shared = True ) && ~ Q ( number__in=[1,6,7] ) )
于 2013-11-07T10:33:09.073 回答
1

~Q

这会让我做一个不查询,然后我可以通过以下方式过滤它shared=True

qs = qs.exclude(~Q(number__in=[1, 6, 7]), shared=True)
于 2013-11-07T10:33:18.107 回答