Python 3 & Django Rest Framework - 如何查询 M-1-M 模型?

Posted

技术标签:

【中文标题】Python 3 & Django Rest Framework - 如何查询 M-1-M 模型?【英文标题】:Python 3 & Django Rest Framework - how to query M-1-M models? 【发布时间】:2020-07-28 18:20:55 【问题描述】:

我有这些模型:

组织

学生

课程

注册

学生属于组织

学生可以注册一门或多门课程

因此,注册记录基本上由给定的课程和给定的学生组成

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()

【问题讨论】:

【参考方案1】:

你反向查询,用:

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

甚至没有先获取Organization:

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

【讨论】:

以上是关于Python 3 & Django Rest Framework - 如何查询 M-1-M 模型?的主要内容,如果未能解决你的问题,请参考以下文章

3.Django中创建app && 编写配置运行Django版的hello world!

python-django框架-orm相关继续&ORM的增删改查操作_20191110

Django的orm的高级操作

Python学习之路:函数式编程介绍&高阶函数

django学习笔记001django版本的确定&创建一个django工程

Django-框架介绍&环境安装