You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动