如何用Django查询同时包含指定书籍ID列表的图书馆
解决方案
假设你的模型结构如下(若实际结构不同,仅需调整关联字段名即可):
class Library(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=100) library = models.ForeignKey(Library, on_delete=models.CASCADE, related_name='books')
要高效获取包含所有指定书籍ID的图书馆,可通过Django ORM的annotate和Count配合过滤实现,全程仅需一次数据库查询,无需遍历所有图书馆或书籍:
from django.db.models import Count, Q # 你的目标书籍ID列表 target_book_ids = [1, 3, 5] # 需要匹配的书籍总数 required_book_count = len(target_book_ids) # 查询符合条件的图书馆 qualified_libraries = Library.objects.annotate( # 统计当前图书馆中属于目标ID列表的书籍数量 matched_books=Count( 'books', filter=Q(books__id__in=target_book_ids) ) ).filter(matched_books=required_book_count)
逻辑说明
annotate会为每个Library对象添加临时字段matched_books,值为该图书馆中ID在target_book_ids内的书籍数量- 后续的
filter仅保留matched_books等于目标书籍总数的图书馆——这意味着该图书馆包含了所有指定的书籍
如果Book和Library是多对多关联(比如通过ManyToManyField),只需把books替换为你的多对多字段名即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Slowloris
相关产品推荐
相关产品推荐

