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始终使用延迟加载从数据库中检索相关字段。
您可以通过渴望使用
1 2 3 | class ProductViewSet(viewsets.ModelViewSet): queryset = Product.objects.prefetch_related('tag').all() serializer_class = ProductSerializer |
参考:prefetch_related