如何在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
相关产品推荐
相关产品推荐

