在restapi(使用Django rest框架)中填充许多字段值时严重影响性能

2024-04-18 11:37:02 发布

您现在位置:Python中文网/ 问答频道 /正文

因为我正在使用django rest框架构建我的产品api。你知道吗

这是我的模特儿型号.py你知道吗

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')

你知道吗序列化程序.py地址:

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__'

你知道吗视图.py地址:

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

我已经给出了ProductViewset的url,所以当我点击api时,它也会给出结果,但是加载要花费太多时间,大约需要2分钟才能给出响应。你知道吗

数据库中有2000个产品对象需要填充。你知道吗

当我排除“ProductSerializer”中的“tag”字段时,所有2000条记录的响应速度都非常快。你知道吗

请说明漏洞在哪里,为什么它会对性能产生如此大的影响,特别是当我添加了这么多字段时。你知道吗


Tags: pyapitruemodel产品modelstagall
1条回答
网友
1楼 · 发布于 2024-04-18 11:37:02

我总是使用django-debug-toolbar来调试我的queryset,以便在我的项目中找到瓶颈/重复查询。Django orm总是使用lazy load从数据库中检索相关字段。 通过使用prefetch_related快速加载多对多字段,可以更改queryset的默认行为。你知道吗

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

引用:prefetch_related

相关问题 更多 >