Django ManyToMany具有特定键的反向查询
我有两张桌子。第一个是基本用户表。第二个是一个名为Section的表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
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()
谢谢现在开始了解相关名称字段的真正用途。。。