在Django中,如何执行以下多对多查询(使用直通表)?

时间:2012-01-19 18:41:06

标签: django django-models django-queryset

在我的模型中,我有一个用户表(他是学生或教师 - 我有一个连接到auth.User的UserProfile表),一个用于课程的表,以及一个名为enrollment的表,它记录了哪些学生已注册在哪些课程。我的models.py如下:

class Course(models.Model):
    name       = models.CharField(max_length=40)
    instructor = models.ForeignKey(UserProfile, related_name="Instructor")
    students   = models.ManyToManyField(UserProfile, through='Enrollment')

class UserProfile(models.Model):
    user       = models.OneToOneField(User, primary_key=True)
    role       = models.CharField(max_length=4, choices=ROLE_CHOICES) # 'stud' or 'inst'

class Enrollment(models.Model):
    course   = models.ForeignKey(Course)
    student  = models.ForeignKey(UserProfile)

对于给定的用户,我想查找他/她注册的所有课程。我该怎么做?

另外,我在哪里可以找到有关如何在Django中进行查询的详尽说明,最好是有很多复杂性慢慢增加的例子?

2 个答案:

答案 0 :(得分:3)

如果您有UserProfile个实例user_profile,请尝试:

courses = Course.objects.filter(students=user_profile)

如果您有User个实例user,则可以使用双下划线表示法。

courses = Course.objects.filter(students__user=user)

要获得解释,我将从Making queries的django文档开始。其他人可能会有其他一些建议。

暂且不说:在这种情况下,除非您使用遗留数据库,否则您实际上不需要显式定义连接表Enrollment,因为您尚未定义任何额外字段。

答案 1 :(得分:2)

如果您拥有User个实例中的username字段,而不是User个实例,则可以执行以下操作:

courses = Course.objects.filter(students__user__username='thespecificusername')

您正在构建的场景与此处讨论的场景非常相似:https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships