Как мы можем использовать два разных сериализатора в одном 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
Вернуться на верх