Сериализатор множественных 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, предполагая, что вы можете сделать более одного запроса для получения данных.