Django多对多对特定键的反向查询



我有两个表。第一个是一个基本的用户表。第二个是名为Section的表。

def User(models.Model):
    ...
    is_teacher = models.BooleanField(default=False)
    ...
def Section(models.Model):
    ...
    teachers = models.ManyToManyField(User, related_name="teachers")
    students = models.ManyToManyField(User, related_name="students")
    is_active = models.BooleanField(default=True)
    ...

我想获得所有的学生用户(在用户表中用is_teacher=False标识),我知道用User.objects.filter(is_teacher=False)可以很容易地完成。

我想获得每个用户的活动部分。

但是,目前,我似乎无法为用户获得部分的集合。

我试过:

students = User.objects.filter(is_teacher=False)
for s in students:
    print s.section_set.all()

但是我得到一个错误,User对象没有section_set。我猜想,因为该部分与User表有两个多对多关系(教师和学生),所以我可能必须更清楚地指定这种关系(以遵循学生关系而不是教师关系)。但我不知道该怎么做。

定义related_name值时,请记住这是反向关系的名称(在您的情况下-从UserSection)。因此,为了使您的代码清晰易懂,我建议您像这样更改名称:

def Section(models.Model):
    ...
    teachers = models.ManyToManyField(User, related_name="sections_where_teacher")
    students = models.ManyToManyField(User, related_name="sections_where_student")
    is_active = models.BooleanField(default=True)
    ...

那么使用关系就像这样:

print s.sections_where_student.all()

try this:

sec = Section.object.filter(students = students, is_active=True)

您将获得活动学生的section对象。

您已经在manymany字段上显式定义了related_name,因此这是您应该使用的访问器:

print s.students.all()

并不是说你使用的实际名字没有多大意义;相反的关系不是"students",而是"sections as a student"。

相关内容

  • 没有找到相关文章

最新更新