You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中筛选多对多字段子集匹配的书籍

Django多对多字段筛选:所有作者属于指定列表的书籍

要筛选出Books模型中所有作者均属于指定列表的书籍,核心思路是排除存在不在指定列表中作者的书籍,或者统计每个书籍的无效作者数并筛选出无效数为0的记录,以下是两种可行实现方式:

方法一:直接排除关联无效作者的书籍

假设Author模型用name字段存储作者名称,指定允许的作者列表为allowed_authors,可以通过反向排除实现:

allowed_authors = ['Neil Gaiman', 'Terry Pratchett', 'Lisa Lutz']
# 先获取所有不在允许列表中的作者,再排除关联这些作者的书籍
invalid_authors = Author.objects.exclude(name__in=allowed_authors)
valid_books = Books.objects.exclude(authors__in=invalid_authors)

方法二:通过注解统计无效作者数

使用Django的注解功能,统计每个书籍关联的不在允许列表中的作者数量,筛选出数量为0的书籍:

from django.db.models import Count, Q

allowed_authors = ['Neil Gaiman', 'Terry Pratchett', 'Lisa Lutz']
valid_books = Books.objects.annotate(
    # 统计当前书籍中不在允许列表的作者数量
    invalid_author_count=Count(
        'authors',
        filter=~Q(authors__name__in=allowed_authors)
    )
).filter(invalid_author_count=0)

以上两种方法都能满足需求:当指定列表为['Neil Gaiman', 'Terry Pratchett', 'Lisa Lutz']时,会返回Good Omens、American Gods、The Passenger,排除包含David Hayward的Heads You Lose。

内容的提问来源于stack exchange,提问作者mionnaise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:50:13