簡體   English   中英

在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中的模型

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:

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:

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加載多對多字段來更改查詢集的默認行為。

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

參考: prefetch_related

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM