Python 3 & Django Rest Framework - как запросить модели M-1-M? - PullRequest
1 голос
/ 15 апреля 2020

У меня есть следующие модели:

  • Организация

  • Студент

  • Курс

  • Зачисление

Студент принадлежит к организации

Студент может записаться на 1 или более курсов

Так запись о зачислении в основном состоит из данного курса и данного учащегося

class Organisation(TimeStampedModel):
  objects = models.Manager()
  name = models.CharField(max_length=50)

  def __str__(self):
    return self.name

class Student(TimeStampedModel):
  objects = models.Manager()
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)
  email = models.EmailField(unique=True)
  organisation = models.ForeignKey(to=Organisation, on_delete=models.SET_NULL, default=None, null=True)

  def __str__(self):
    return self.email

class Course(TimeStampedModel):
  objects = models.Manager()
  language = models.CharField(max_length=30)
  level = models.CharField(max_length=2)

  def __str__(self):
    return self.language + ' ' + self.level

  class Meta:
    unique_together = ("language", "level")

class Enrollment(TimeStampedModel):
  objects = models.Manager()
  course = models.ForeignKey(to=Course, on_delete=models.CASCADE, default=None, null=False)
  student = models.ForeignKey(to=Student, on_delete=models.CASCADE, default=None, null=False)
  enrolled = models.DateTimeField()
  last_booking = models.DateTimeField()
  credits_total = models.SmallIntegerField(default=10)
  credits_balance = models.DecimalField(max_digits=5, decimal_places=2)

Учитывая идентификатор организации, я понимаю, что могу получить зачисления на одного учащегося, например:

o=Organisation.objects.get(id=1)
o.student_set.all()[0].enrollment_set.all()

но как я могу получить ВСЕ записи для данной организации?

Например, если я хочу посчитать, сколько студентов из данной организации записались на курсы? Примерно так:

o.student_set.enrollment_set.count()

1 Ответ

1 голос
/ 15 апреля 2020

Вы выполняете запрос в обратном порядке:

Enrollment.objects.filter(<b>student__organisation=o</b>).count()

или даже без предварительного извлечения Organization:

Enrollment.objects.filter(<b>student__organisation__id=1</b>).count()
...