首页 > 解决方案 > N个重复查询嵌套模型

问题描述

我有一个允许子区域的区域模型(您可能会将其视为具有子类别的类别)。我通过将一个字段嵌套到 self 作为外键来实现这一点。

class Area(models.Model):
  area = models.CharField(max_length=120)
  parent = models.ForeignKey('self', models.CASCADE, blank=True, null=True, related_name='subarea')

  def __str__(self):
    return self.area

使用 django 休息框架,我设法获得了正确的输出。问题是,当我使用 django-toolbar 分析请求时,会发出多个重复的请求(N*Area(parent=None))。我已经通过使用 prefetch_related 或 select_related 解决了类似的问题。但从来没有用嵌套模型做过。有没有办法解决这个问题?还是这个模型的设计不好?

我设法使用以下视图序列化正确的输出,并且

class ListArea(generics.ListCreateAPIView):
    serializer_class = AreaSerializer
    queryset = Area.objects.prefetch_related('parent').filter(parent=None)

和序列化器

class SubAreaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Area
        fields = ('area','id')

class AreaSerializer(serializers.ModelSerializer):
    subarea=SubAreaSerializer(many=True)
    class Meta:
        model = Area
        fields = ('area','id','subarea')

或者这些额外的调用可能是由于可浏览的 API 造成的?

解决方案

我在以下线程Django 的帮助下解决了这个问题: Prefetch_related() 是否遵循反向关系查找?

代替

queryset = Area.objects.prefetch_related('parent').filter(parent=None)

我应该使用

queryset = Area.objects.prefetch_related('parent').prefetch_related('subarea')

标签: djangodjango-rest-framework

解决方案


推荐阅读