Как мы можем использовать два разных сериализатора в одном generics.ListAPIView, переопределяя метод get_queryset()?
Мой Views.py
class RelatedFacultyProfile(generics.ListAPIView):
serializer_class = FacultyProfileGenericSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
helper = UserTypeHelper(self.request, path=False)
if helper.user_type == 'F':
queryset = Faculty.objects.filter(department=self.request.user.faculty.department)
if helper.user_type == 'S':
queryset = Faculty.objects.filter(department=self.request.user.student.branch)
return queryset
class RelatedStudentProfile(generics.ListAPIView):
serializer_class = StudentProfileGenericSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
helper = UserTypeHelper(self.request, path=False)
if helper.user_type == 'F':
queryset = Student.objects.filter(branch=self.request.user.faculty.department)
if helper.user_type == 'S':
queryset = Student.objects.filter(branch=self.request.user.student.branch)
return queryset
Я хочу объединить наборы запросов этих двух представлений для создания одного JSON-ответа, что потребует двух разных сериализаторов. Как этого достичь?
Вы можете отменить get_serializer_class с помощью:
class RelatedProfile(generics.ListAPIView):
permission_classes = [IsAuthenticated]
def get_queryset(self):
helper = UserTypeHelper(self.request, path=False)
if helper.user_type == 'F':
queryset = Student.objects.filter(branch=self.request.user.faculty.department)
if helper.user_type == 'S':
queryset = Student.objects.filter(branch=self.request.user.student.branch)
return queryset
def get_serializer_class(self):
helper = UserTypeHelper(self.request, path=False)
if helper.user_type == 'F':
return StudentProfileGenericSerializer
if helper.user_type == 'S':
return FacultyProfileGenericSerializer
Вам следует попробовать использовать пакет DjangoRestMultipleModels. Конкретно для вашего использования ObjectMultipleModelAPIView будет правильным выбором. Он обладает дополнительным преимуществом пагинации, поэтому вы получите выигрыш в производительности при запросе наборов запросов.
Также переопределите функцию get_querylist() так
def get_querylist(self):
helper = UserTypeHelper(self.request, path=False)
if helper.user_type == 'F':
querylist = [{'queryset': Faculty.objects.filter(department=self.request.user.faculty.department), 'serializer_class': FacultyProfileGenericSerializer},
{'queryset': Student.objects.filter(branch=self.request.user.faculty.department), 'serializer_class': StudentProfileGenericSerializer}]
if helper.user_type == 'S':
querylist = [{'queryset': Faculty.objects.filter(department=self.request.user.student.branch)), 'serializer_class': FacultyProfileGenericSerializer},
{'queryset': Student.objects.filter(branch=self.request.user.student.branch), 'serializer_class': StudentProfileGenericSerializer}]
return querylist