首先,我想坚持一些 pep8 修复
class School(models.Model):
name = models.CharField(max_length=100)
students = models.ManyToManyField(Student)
class Classroom(models.Model):
school = models.ForeignKey(School, on_delete=models.CASCADE)
students = models.ManyToManyField(Student)
其次,除非您有理由将 name.max_length 设置为 100,否则请将其设置为 255。
name = models.CharField(max_length=255)
我还设置了一个相关名称以使事情变得更容易
class Classroom(models.Model):
school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='classrooms')
students = models.ManyToManyField(Student)
现在,解决你的问题。
你的逻辑是说一所学校可以有很多学生,一个学生可以在很多学校注册(很奇怪,但我会应付),一个教室可以存在于学校内部,一个学校可以有多个教室,一个教室有很多学生。这是一个关键,你不需要在学校里保存学生,你可以使用类似的东西
class School(models.Model):
name = models.CharField(max_length=100)
students = models.ManyToManyField(Student)
@property
def students(self):
# iterate the class room, return a QS with all students from them
# there're operators for union, but I'm using the function itself
qs = Student.objects.none()
for classroom in self.classrooms: # related name in action
qs = qs.union(classroom.students)
return qs
我会添加一个注释,你想要的行为可以在一个信号中完成#DON'T DO THING,JUST KNOW IT
More info