Django使用通用外键时如何单次查询获取多级关联Note对象
解决方案
利用Django ORM泛型关联预设的related_query_name参数,可实现单次查询拿到所有关联Note的查询集,写法如下:
# 假设你已经拿到目标Message实例,变量名为message notes = Note.objects.filter(records__messages=message)
如果需要直接获取结果列表,直接调用list(notes)即可,返回的QuerySet也支持继续叠加过滤、排序等ORM操作。
实现原理
Record模型中notes字段的related_query_name='records'配置,允许从Note侧通过records反向关联到对应的Record实例Message模型中records字段的related_query_name='messages'配置,允许从Record侧通过messages反向关联到对应的Message实例- Django ORM原生支持链式跨关联查询,
records__messages会自动完成两次泛型关联的条件匹配,全程仅触发1次带JOIN的SQL查询,彻底解决你原有写法的N+1查询性能问题。
等价手动实现(可选参考)
如果你想手动控制查询逻辑,也可以通过ContentType+子查询实现,同样是单次查询:
from django.contrib.contenttypes.models import ContentType record_ct = ContentType.objects.get_for_model(Record) message_ct = ContentType.objects.get_for_model(Message) notes = Note.objects.filter( content_type=record_ct, object_id__in=Record.objects.filter( content_type=message_ct, object_id=message.id ).values_list("id", flat=True) )
内容的提问来源于stack exchange,提问作者psky
相关产品推荐
相关产品推荐

