Сериализатор множественных qyeryset в DRF

нужна помощь с сериализаторами.

Я начинающий пользователь DRF. Я запрашиваю объекты и сериализую каждый из них своим сериализатором модели, затем вручную записываю все данные сериализатора в ответ в формате json. Я уверен, что есть лучший способ сделать это, который также может быть более эффективным.

В настоящее время мой код выглядит следующим образом:

class GetData(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user

        subjects = Subject.objects.all()
        serializersubject = SubjectSerializer(subjects, many=True)

        subject_skill_levels = SubjectSkillLevel.objects.filter(user=user)
        serializer2 = SubjectSkillLevelSerializer(subject_skill_levels, many=True)

        topic_skill_levels = TopicSkillLevel.objects.filter(user=user)
        serializer3 = TopicSkillLevelSerializer(topic_skill_levels, many=True)

        progress = Progress.objects.filter(user=request.user).order_by("-date")
        todays = progress[:1][0]
        last_5_days = progress.exclude(id=todays.id)[:5]

        todays_serializer = ProgressSerializer(todays)
        last_5_days_serializer = ProgressSerializer(last_5_days, many=True)

        history = ExerciseToken.objects.filter(user=request.user, completed=True).order_by("-id")
        history_serializer = HistorySerializer(history, many=True)

        notes = Note.objects.filter(user=request.user)
        notes_serializer = NotesSerializer(notes, many=True)

        data = {
            "username": user.username,
            "subjects": serializersubject.data,
            "skill_level": {
                "subjects" : serializer2.data,
                "topics" : serializer3.data
            },
            "progress": {
                "todays": todays_serializer.data,
                "last_5_days": last_5_days_serializer.data
            },
            "history": history_serializer.data,
            "notes": notes_serializer.data
        }        
        
        return Response(data)

Похоже, что у вас есть user как общий ключ для большинства моделей (кроме Subjects). Поэтому одним из решений было бы иметь ModelViewSet для User, с соответствующими данными, связанными с этими сериализаторами, как это:

class UserSerializers(serializers.ModelSerializer):
    progress_set = ProgressSerializer(many=True)
    ...

    class Meta:
        model=User
        fields=(
               'username','progress_set','notes_set','exercisetoken_set',...

          )
class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializers

Это просто пример, который возвращает объекты, связанные с пользователем, в структурированном виде. Subjects Возможно, лучше использовать собственный API, предполагая, что вы можете сделать более одного запроса для получения данных.

Вернуться на верх