DRF multiple qyeryset serializer

Viewed 33

need some help with serializers.

I am a beginner in DRF. I query for objects and serialize each with their own model serializer then manually write down all serializer data in the response in json format. I am sure there is a better way to do this that could also be more efficient.

Currently my code looks like this:

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)
1 Answers

Looks like you have user as a common key for most of the models (apart from Subjects). So one solution would be to have a ModelViewSet for User, with the related data related on those serializers, like this:

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

This is just an example that would return user-related objects in a structured way. Subjects would probably be better served on its own API, assuming you can make more than one request to get the data.

Related