Django:排除的多个参数由AND的AND加入

时间:2015-08-24 11:36:52

标签: django many-to-many django-queryset django-orm

根据文档,exclude()通过AND连接多个参数,但我的查询似乎使用OR逻辑。

我有以下型号:

class Book(models.Model):
    # some fields
    authors = models.ManyToManyField(Author)

我希望得到除了那些之外的所有书籍,其中只有一位作者,作者的身份证明是“12”:

q_and = Book.objects.annotate(authors_number=Count('authors')).exclude(authors_number=1, authors__in=['12'])

但相反,我得到的结果类似于OR逻辑的查询:

q_or = Book.objects.annotate(authors_number=Count('authors')).exclude(authors_number=1).exclude(authors__in=['12'])

如果我使用唯一的作者和作者的id = '12'过滤书籍,我会得到我需要排除的内容:

need_to_exclude = Book.objects.annotate(authors_number=Count('authors')).filter(authors_number=1, authors__in=['12'])

我知道如何在两个查询中制作,我想要的是什么,但如何使用exclude()如何使用一个查询进行相同操作?

我的查询有什么问题?

1 个答案:

答案 0 :(得分:0)

Try this; This is the OR operation.

from django.db.models import Q

q = Q(Q(authors_number=1)| Q(authors__in=['12']))
q_and = Book.objects.annotate(authors_number=Count('authors')).exclude(q).distinct()