Необходимо сериализовать пользовательские записи AVG для моего API в Django
models.py
from django.db import models
from django.db.models import Avg
from users.models import UserProfile
from subjects.models import Subject
class Note(models.Model):
id_user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='user_note')
id_subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name='subject_note')
exam_note = models.IntegerField()
@property
def average_note(self):
if hasattr(self, '_average_note'):
return self._average_note
return Note.objects.aggregate(Avg('exam_note'))
Это мои модели нот, и мне нужно вычислить среднее значение нот, чтобы сериализовать его и отправить в запрос ответа
views.py
class AvgNoteViewSet(viewsets.ModelViewSet):
serializer_class = AvgSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (NotePermissions,)
def get_queryset(self):
return Note.objects.all().annotate(_average_note=Avg('exam_note'))
И это мой метод get_queryset, переопределенный для вычисления среднего значения нот, но у меня просто есть список нот для результата этого запроса, вот так: resques response
serializers.py
class AvgSerializer(serializers.ModelSerializer):
"""
Serializes a notes AVG
"""
average_note = serializers.SerializerMethodField()
def get_average_note(self, obj):
return obj.average_note
class Meta:
model = Note
fields = ['average_note']
А это мой сериализатор
Я пытаюсь получить среднее значение из exam_notes от зарегистрированного пользователя, поэтому я понимаю, что мне нужно попытаться сгруппировать по user_id, а затем агрегировать среднее значение. Вот моя таблица postgresql, из которой я делаю запрос: notes_table
Я основываю свой код на Как вычислить среднее значение некоторого поля в Django модели и отправить его в rest API? , но я пытаюсь получить некоторый результат, как при выполнении следующего запроса:
SELECT avg(exam_note)
FROM public.notes_note x
group by id_user_id
Чтобы добавить функцию GROUP BY, вы просто добавите values
в метод get_queryset следующим образом:
class AvgNoteViewSet(viewsets.ModelViewSet):
serializer_class = AvgSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (NotePermissions,)
def get_queryset(self):
return Note.objects.all().values('id_user').annotate(_average_note=Avg('exam_note'))