我有两个表。第一个是一个基本的用户表。第二个是名为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
值时,请记住这是反向关系的名称(在您的情况下-从User
到Section
)。因此,为了使您的代码清晰易懂,我建议您像这样更改名称:
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"。