如何用Django ORM实现Ship、Address、Photos三表关联查询?
Django ORM 三表关联查询方案
由于Ship与Photos是一对多关系(单艘船对应多张图片),需结合select_related和prefetch_related实现一次查询拉取所有关联数据:
核心查询代码
# 同时关联Address和预取Photos数据 ships_queryset = Ship.objects.select_related('address').prefetch_related('photoship')
数据遍历与展示
获取查询集后,可直接遍历获取所有关联数据,无额外数据库查询:
for ship in ships_queryset: # 获取关联的地址信息 ship_address = ship.address # 获取该船的所有图片 ship_photos = ship.photoship.all() # 此处可将ship、ship_address、ship_photos的数据渲染到表格中
关键逻辑说明
select_related('address'):处理Ship到Address的多对一正向关联,通过SQL JOIN一次性拉取地址数据,避免N+1查询。prefetch_related('photoship'):处理Ship到Photos的一对多反向关联(对应Photos模型中设置的related_name="photoship"),先批量拉取所有船的图片数据,再在Python层面完成关联,同样避免重复查询。
内容的提问来源于stack exchange,提问作者Pablo J
相关产品推荐
相关产品推荐

