Django:排除中的多个参数通过 OR 代替 AND 来连接

问题描述 投票:0回答:1

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

我有以下型号:

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

我想获取除那些只有一位作者且作者 ID 为“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()

在一个查询中实现相同的内容

我的查询有什么问题吗?

django many-to-many django-queryset django-orm
1个回答
0
投票

试试这个;这就是“或”运算。

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()
© www.soinside.com 2019 - 2024. All rights reserved.