关于python:严重影响在rest api中填充ManyToMany字段值的性能(使用django rest框架)

Badly affecting performance in populating ManyToMany field values in rest api (using django rest framework)

当我使用django rest框架构建我的产品api时。

这是我在models.py

中的模型

1
2
3
4
5
6
class Tag(models.Model):
    tag = models.CharField(max_length=10, unique=True)

class Product(models.Model):
    product_name = models.CharField(max_length=100)
    tag = models.ManyToManyField(Tag, blank=True, default=None, related_name='product_tag')

serializers.py:

1
2
3
4
5
6
7
8
9
10
11
class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = '__all__'

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    tag = TagSerializer(many=True, read_only=True)

    class Meta:
        model = Product
        fields = '__all__'

views.py:

1
2
3
class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

我已经给出了ProductViewset的url,因此当我点击api时,它也可以给我结果,但是加载时间太长,大约需要2分钟才能给我响应。

我的数据库中有2000个产品对象,需要填充。

当我排除" ProductSerializer"中的"标签"字段时,对所有2000条记录的响应很快。

请提出漏洞在哪里,为什么它会如此严重地影响性能,尤其是当我添加此ManyToMany字段时。


我总是使用django-debug-toolbar调试我的查询集,以在项目中查找瓶颈/重复查询。 Django orm始终使用延迟加载从数据库中检索相关字段。
您可以通过渴望使用prefetch_related加载多对多字段来更改查询集的默认行为。

1
2
3
class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.prefetch_related('tag').all()
    serializer_class = ProductSerializer

参考:prefetch_related