Django嵌套MPTT模型关联ManyToManyField查询出现重复如何解决
问题原因
你遇到的重复查询由两个核心问题导致:
- 视图代码传参错误:序列化数据库查询结果时你错误使用了
data参数,该参数是反序列化(接收前端数据做校验)时使用的,序列化数据库实例应该传instance,错误传参会触发大量不必要的额外查询。 - 预取逻辑不完善:
- 你手动指定了
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
相关产品推荐
相关产品推荐

