django - 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')
解决方案
推荐阅读
- go - 使用 bufio 读取 Go 中的一行后,如何使用 fmt.Scan 读取字符串?
- react-native - i18n-js 不适用于对象 javascripts
- javascript - 我正在尝试向我之前创建的对象添加一个元素,但我收到一个错误,即 type {} javascript 上不存在属性
- r - R Shiny - 使用文件输入向传单地图添加标记
- c# - 显示为空 WPF 的文本框
- python - 使用 Trello API (python) 在 trello 中删除重复的 checkItem
- javascript - 如何使用 javascript 显示正确的“变音符号”
- javascript - 如何使用反应创建自动幻灯片
- umijs - 找不到模块“umi”
- swift - ld:架构 arm64 的无效值(生产者:'LLVM13.0.0-rust-1.57.0-nightly' 读者:'LLVM APPLE_1_1300.0.29.3_0')