[英]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.