在REST API查询中优化外键和多字段

问题描述 投票:0回答:1

我想知道在使用外键和ManytoMany字段时是否有优化api,例如:

串行器:

class SerializerA(serializers.ModelSerializer):
    class Meta:
        model = Model_A
        fields = ('id', 'official_name', 'gender')
        depth = 1

class SerializerB(serializers.ModelSerializer):
    user = SerializerA(many=True)
    class Meta:
        model = Model_B
        fields = ('id', 'project_name','project_type', 'project_start_date', 'user')
        depth = 1

API:

class ReportAPI(APIView):
    def get(self, request):
        all_projects = Model_B.objects.all()
        project_serializer = SerializerB(all_projects, many=True)
        return Response(project_serializer.data)

现在有了这个,如果我去API网址,并调试这个页面,它会显示我从SQL查询中查询了78次。但是如果我从'gender'的manytoMany seriealizer字段中删除一个字段,那么页面现在只会从数据库中查询21次,所以我的问题再次出现,我该如何优化呢?

rest api django-rest-framework
1个回答
1
投票

您可以使用select_related(对于ForeignKey)和/或prefetch_related(对于ManyToMany或ManyToOne),以便它不会为每个Model_B对象命中数据库。

如果userModel_B的FK,那么你可以这样做:

class ReportAPI(APIView):
    def get(self, request):
        all_projects = Model_B.objects.all().select_related('user')
        project_serializer = SerializerB(all_projects, many=True)
        return Response(project_serializer.data)

如果用户模型在其序列化程序中具有您需要的其他FK,那么您也可以执行select_related('user', 'user__other_field')

© www.soinside.com 2019 - 2024. All rights reserved.