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

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