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

Django嵌套MPTT模型关联ManyToManyField查询出现重复如何解决

问题原因

你遇到的重复查询由两个核心问题导致:

  1. 视图代码传参错误:序列化数据库查询结果时你错误使用了data参数,该参数是反序列化(接收前端数据做校验)时使用的,序列化数据库实例应该传instance,错误传参会触发大量不必要的额外查询。
  2. 预取逻辑不完善:
    • 你手动指定了children__children的固定两层预取,更深层级的子节点没有被预取,递归序列化时访问深层子节点会触发逐次查询。
    • 只预取了根节点的games,各级子节点关联的games没有被预取,每个子节点访问自身关联的游戏时都会触发单独查询。

修复方案

按如下修改视图代码即可:

from django.db.models import Prefetch
from rest_framework.response import Response
# 其余原有导入保持不变

class GamesByGenreAPI(APIView):
    def get(self, request, *args, **kwargs):
        # 一次性预取所有分类关联的游戏
        all_genres = Genre.objects.all().prefetch_related(
            Prefetch('games', queryset=Game.objects.all())
        )
        # 缓存整棵分类树的层级关系,避免递归查询子节点
        cached_root_genres = Genre.objects.cache_tree(all_genres)
        # 注意序列化要传instance参数,不要传data
        ser = GenreGameSerializer(instance=cached_root_genres, many=True)
        return Response(ser.data)

修改后查询会缩减为3次:查询全部分类、查询分类与游戏的关联表、查询全部游戏,不会再出现逐分类的重复查询。


内容的提问来源于stack exchange,提问作者user5170375

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:24:03