Django ViewSet返回资产列表时反向外键导致重复查询怎么优化?
问题根因
你遇到的是Django ORM典型的N+1查询问题:默认查询Asset表时不会主动关联外键对应的AssetType表数据,序列化器每次访问asset_type.name属性时都会触发一次单独的数据库查询,6条资产就会产生1次资产列表查询+6次资产类型查询,也就是你观测到的重复查询现象。
优化方案
直接修改ViewSet中的queryset,使用select_related预加载关联的asset_type数据即可,修改后代码如下:
class AssetViewSet(mixins.ListModelMixin,viewsets.GenericViewSet): # select_related会通过JOIN语句一次性查询资产+对应资产类型数据,无额外查询 queryset = Asset.objects.select_related('asset_type').all() serializer_class = AssetSerializer
方案说明
select_related适用于正向外键、一对一关联的场景,会在首次查询时通过SQL JOIN把关联表的指定字段一起查询返回,不需要后续重复访问数据库- 优化后原有的7次查询会直接降到1次,接口响应速度会大幅提升
- 如果你后续遇到反向关联查询(比如查资产类型时带出所有关联资产)的场景,可以用
prefetch_related实现预加载,避免重复查询
内容的提问来源于stack exchange,提问作者Shubham Periwal
相关产品推荐
相关产品推荐

