【发布时间】:2020-12-18 17:01:56
【问题描述】:
我正在使用 Django 2.2 和 Django REST Framework。
我有以下模型结构
class MyModel(models.Model):
name = models.ChartField(max_length=200)
class Tag(models.Model):
name = models.ChartField(max_length=50, unique=True)
class MyModelRelation(models.Model):
obj = models.ForeignKey(MyModel, related_name='relation')
user = models.ForeignKey(User)
tags = models.ManyToManyField(Tag)
def tag_list(self):
return self.tags.all().values_list('name', flat=True).distinct()
我想用MyModel 实例获取标签列表,为此,序列化程序是
class MyModelSerializer(serializers.ModelSerializer):
tags_list = serializers.SerializerMethodField(read_only=True)
def get_tags_list(self, obj):
return obj.relation.tag_list()
class Meta:
fields = [
'name',
'tags_list'
]
视图是
class ObjListView(ListAPIView):
serializer_class = MyModelSerializer
def get_queryset(self):
return super().get_queryset().select_related('relation').prefetch_related('relation__tags')
但要获得 58 条记录,它运行了将近 109 个查询。
my_app_mymodel`, `my_app_mymodelrelation_tags 重复多次
【问题讨论】:
-
这是由于模型类中的
tag_list方法。每个模型实例都会调用它,而且很可能会调用两次。请注意,此类查询作为新的数据库查询运行,因此您的 select_related 或 prefetch_related 没有帮助。您可以尝试注释tag_list而不是使用方法 -
我在序列化方法字段中使用了相同的逻辑,并且查询的数量仍然相同。能举个带注释的例子吗?
-
在下面查看我的答案
标签: django django-rest-framework many-to-many django-orm