{DRF | Django} Как получить количество предметов, изучаемых каждым студентом в "django"
У меня есть две модели django 'Students' и 'Enrollments'.
Схема модели для них выглядит следующим образом:
class Students(models.Model):
id = models.AutoField(primary_key=True, unique=True)
name = models.CharField()
class Enrollments(models.Model):
enroll_id = models.AutoField(primary_key=True, unique=True)
student_id = models.ForeignKey(Students, on_delete=models.CASCADE)
subjects = models.charField()
Я пытаюсь добиться результата следующего sql запроса в Django Rest Framework, для получения количества предметов, записанных студентами (индивидуально).
select
s.id, s.name, count(e.subjects) as count
from Students as s
left outer join Enrollments as e
on e.student_id_id = s.id
group by s.id, s.name, e.subjects
order by count asc;
Этот запрос возвращает результат вида:
---------------------------
| id | name | count |
---------------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 2 |
---------------------------
Может ли кто-нибудь помочь мне достичь такого результата.
Примечание: Мне также нужны данные о студентах из числа 0 человек.
Что вы можете сделать, так это при создании сериализатора добавить поле метода сериализатора, которое будет получать подсчет для вас.
Добавьте это в верхней части вашего сериализатора:
count = serializers.SerializerMethodField('get_count')
Затем добавьте функцию внутри вашего сериализатора следующим образом:
def get_count(self, obj):
try:
return Enrollments.objects.filter(student_id=obj.id).count()
except:
return None
Наконец, добавьте 'count' в список полей. После этого вы можете добавить столько полей, сколько захотите. Надеюсь, это поможет вам добиться желаемого результата. Также не забудьте использовать "select_related" в ORM внутри вашего представления, чтобы уменьшить количество запросов.