如何减少生成Django Restful服务的SQL数量

时间:2019-01-26 08:44:31

标签: django python-3.x django-rest-framework django-queryset django-serializer

我需要帮助来改善API性能。下面是我的方法,我也尝试做其他与select_related或prefetch_related相关的字段组合,但我仍然收到类似400sqls的信息。

model.py

    class VisVisits(models.Model):    
            visit_id = models.IntegerField(primary_key=True)
null=True)
            class Meta:
                managed = False
                db_table = 'vis_visits'

        def __str__(self):
            return str(self.visit_id)

    class VisVisitData(models.Model):

        vdata_id = models.IntegerField(primary_key=True)
        app_local_id = models.IntegerField(blank=True, null=True)
        visit = models.ForeignKey('VisVisits', models.DO_NOTHING, blank=True, null=True, related_name='data')    
        class Meta:
            managed = False
            db_table = 'vis_visit_data'

        def __str__(self):
            return str(self.vdata_id)

序列化器

class VisVisitDataSerializer(serializers.ModelSerializer):

     class Meta:
        model = VisVisitData
        field = '__all__'

class VisVisitsSerializer(serializers.ModelSerializer):

    data = VisVisitDataSerializer(many=True)

    class Meta:
        model = VisVisits
        fields = ('visit_id','data')

views.py

visit_data = VisVisits.objects.filter(is_valid=1,user_id=u).prefetch_related('school_program__school')
visit_data_serializer = VisVisitsSerializer(visit_data,context={'request':request},many=True)

1 个答案:

答案 0 :(得分:0)

要减少查询数量,您必须预取在VisVisitsSerializer中序列化的数据,即data。在此序列化程序中,您不包括school_program,因此不必预取它。您可以使用django调试工具栏(https://django-debug-toolbar.readthedocs.io/en/latest/)检查重复的查询,并找出要放入select_releted / prefetch_related

中的内容