我想知道在使用外键和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次,所以我的问题再次出现,我该如何优化呢?
您可以使用select_related
(对于ForeignKey)和/或prefetch_related
(对于ManyToMany或ManyToOne),以便它不会为每个Model_B
对象命中数据库。
如果user
是Model_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')
。