Python 3 & Django Rest Framework - 如何查询M-1-M模型?
Python 3 & Django Rest Framework - how to query M-1-M models?
我有这些型号:
组织
学生
课程
报名人数
一个学生属于一个组织
一个学生可以注册一门或多门课程
所以注册记录基本上由给定的课程和给定的学生组成
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)
根据组织 ID,我知道我可以获得单个学生的注册信息,如下所示:
o=Organisation.objects.get(id=1)
o.student_set.all()[0].enrollment_set.all()
但我如何检索给定组织的所有注册?
例如,如果我想统计有多少来自给定组织的学生注册了课程?像这样:
o.student_set.enrollment_set.count()
你反向查询,用:
Enrollment.objects.filter(<b>student__organisation=o</b>).count()
甚至不先获取 Organization
:
Enrollment.objects.filter(<b>student__organisation__id=1</b>).count()
我有这些型号:
组织
学生
课程
报名人数
一个学生属于一个组织
一个学生可以注册一门或多门课程
所以注册记录基本上由给定的课程和给定的学生组成
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)
根据组织 ID,我知道我可以获得单个学生的注册信息,如下所示:
o=Organisation.objects.get(id=1)
o.student_set.all()[0].enrollment_set.all()
但我如何检索给定组织的所有注册?
例如,如果我想统计有多少来自给定组织的学生注册了课程?像这样:
o.student_set.enrollment_set.count()
你反向查询,用:
Enrollment.objects.filter(<b>student__organisation=o</b>).count()
甚至不先获取 Organization
:
Enrollment.objects.filter(<b>student__organisation__id=1</b>).count()