Django中如何获取关联指定Note实例的所有Book模型实例?
解决Django中获取关联指定Note的Book实例问题
嘿,我来帮你搞定这个问题!首先给你最简洁的解决方案——直接用Django ORM的跨表关联查询,一步到位:
my_note = Note.objects.get(name="Arbitrary") books_with_my_note = Book.objects.filter(page__note=my_note).distinct()
为什么这个方法可行?
Django的ORM支持双下划线(__)跨表查询,这里的page__note意思是:找到所有关联了包含指定Note的Page的Book。最后加distinct()是为了去重——毕竟同一个Book可能有多个Page关联了同一个Note,避免重复返回同一个Book实例。
修复你之前的代码思路
如果你还是想用先查Page再找Book的方式,之前的报错是因为values_list("book")返回的是包含Book对象的元组集合,在部分Django版本里直接调用distinct()会触发SQL生成的问题。调整一下写法就能解决:
my_note = Note.objects.get(name="Arbitrary") # 提取关联的book_id列表,flat=True让结果变成单个值的列表,而非元组 page_book_ids = Page.objects.filter(note=my_note).values_list('book_id', flat=True).distinct() # 用book_id列表查询对应的Book books_with_my_note = Book.objects.filter(id__in=page_book_ids)
这里的关键是用book_id(外键的ID字段)代替book,再加上flat=True,这样values_list返回的是纯ID值的列表,后续的distinct()和id__in查询就不会有问题了。
内容的提问来源于stack exchange,提问作者Saturnix




