Django ManyToMany具有特定键的反向查询

Django ManyToMany具有特定键的反向查询,django,postgresql,manytomanyfield,Django,Postgresql,Manytomanyfield,我有两张桌子。第一个是基本用户表。第二个是一个名为Section的表 def User(models.Model): ... is_teacher = models.BooleanField(default=False) ... def Section(models.Model): ... teachers = models.ManyToManyField(User, related_name="teachers") students = mod

我有两张桌子。第一个是基本用户表。第二个是一个名为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\u teacher=False
标识),我知道这可以通过
User.objects.filter(is\u teacher=False)
轻松完成

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

但是,目前,我甚至无法为用户获取一组部分

我试过:

students = User.objects.filter(is_teacher=False)
for s in students:
    print s.section_set.all()
但是我得到一个错误,
用户
对象没有
节集
。我猜,因为该部分与用户表(教师和学生)有两个多对多关系,所以我可能必须更清楚地指定关系(遵循学生的关系,而不是教师的关系)。但我不知道该怎么做

试试这个:

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

您将为处于活动状态的学生获取节对象。

您已经在许多字段上明确定义了
相关的\u name
,因此您应该使用以下访问器:

print s.students.all()

并不是说你使用的实际名称没有多大意义;反向关系不是“学生”,而是“作为学生的节”。

在定义
相关的\u名称
值时,请记住这是反向关系的名称(在您的情况下,从
用户
)。因此,为了保持代码清晰易懂,我建议您更改以下名称:

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()
然后使用关系如下所示:

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

谢谢现在开始了解相关名称字段的真正用途。。。