进行“不在”查询

时间:2013-11-07 10:27:31

标签: 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)

现在,从那个Thing列表中,我想排除任何项目:

  • 分享为True,
  • 数字任何值[1, 6, 7]

在我脑海里,我会这样做:

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

__not__in不存在,是吗?我觉得我需要摇晃这个以交叉两个查询,但这对于那些 复杂的事情感到恶心。我最好的前进方向是什么?

2 个答案:

答案 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)