Skip to main content
 首页 » 编程设计

python之Django 休息框架返回嵌套序列化数据的时间太长

2024年10月24日38mate10pro

我们有四个相关的模型,同时返回查询集序列化数据太慢(serializer.data)。下面是我们的模型和序列化器。

为什么 Django 嵌套序列化器返回渲染响应的时间太长。我们在这里做错了什么?

注意:当从 EC2 实例连接时,我们的数据库位于 AWS 中,但当从我的本地主机尝试时,它非常慢。返回的json大小为700KB。

模型.py

class ServiceType(models.Model): 
    service_name = models.CharField(max_length = 100) 
    description = models.TextField() 
    is_active = models.BooleanField(default = 1) 
 
class Service(models.Model): 
    service_name = models.CharField(max_length = 100) 
    service_type = models.ForeignKey(ServiceType, related_name = "type_of_service") 
    min_duration = models.IntegerField() ##duration in mins 
 
class StudioProfile(models.Model): 
 
   studio_group = models.ForeignKey(StudioGroup, related_name = "studio_of_group") 
   name = models.CharField(max_length = 120) 
 
class StudioServices(models.Model): 
   studio_profile = models.ForeignKey(StudioProfile, related_name = "studio_detail_for_activity") 
   service = models.ForeignKey(Service, related_name = "service_in_studio") 
 
class StudioPicture(models.Model): 
   studio_profile  = models.ForeignKey(StudioProfile, related_name = "pic_of_studio") 
   picture = models.ImageField(upload_to = 'img_gallery', null = True, blank = True) 

序列化器.py

class ServiceTypeSerializer(serializers.ModelSerializer): 
 
    class Meta: 
       model = ServiceType 
       fields = ('id', 'service_name') 
 
class ServiceSerializer(serializers.ModelSerializer): 
 
    service_type = ServiceTypeSerializer() 
    class Meta: 
        model = Service 
        fields = ('id', 'service_type', 'service_name') 
 
class StudioServicesSerializer(serializers.ModelSerializer): 
    service = ServiceSerializer() 
    class Meta: 
        model = StudioServices 
        fields = ('service','price','is_active','mins_takes') 
 
class StudioPictureSerializer(serializers.ModelSerializer): 
    class Meta: 
        model = StudioPicture 
        fields = ('picture',) 
 
class StudioProfileSerializer(serializers.ModelSerializer): 
    studio_detail_for_activity = StudioServicesSerializer(many = True) 
    pic_of_studio = StudioPictureSerializer(many = True) 
    class Meta: 
       model = StudioProfile 
       fields = ('id', 'name','studio_detail_for_activity','pic_of_studio') 

View .py

class StudioProfileView(ListAPIView): 
    serializer_class = StudioProfileSerializer 
    model = StudioProfile 
    def get_queryset(self): 
        try: 
           queryset = self.model.objects.all() 
        except Exception ,e: 
           logger_error.error(traceback.format_exc()) 
           return None 
        else: 
           return queryset 

请您参考如下方法:

你检查过哪个部分是慢的吗?比如,你在那个数据库中有多少条记录?我会尝试运行查询并检查查询是否很慢,然后我会检查少于 100 个寄存器的序列化器等等。

我建议您阅读这篇文章 http://www.dabapps.com/blog/api-performance-profiling-django-rest-framework/为了评估如何分析您的 API

问候