【问题标题】:How to reduces number of sqls generating Django restful services如何减少生成 Django restful 服务的 sql 数量
【发布时间】:2019-01-26 08:44:31
【问题描述】:

我需要帮助来提高 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)

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多