You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:42:00