刚接触Django并且对python来说比较新,我正在编写一个知识报告网页。
我有两个具有已定义的MtM关系的模型:
Class Student:
level_of_knowledge = model.ManyToMany(Topic)
...
Class Topic:
...
预期用途:
每个学生对每个主题都有一定程度的理解(每个主题的主题列表都完全相同),从" Basic
"开始。理解水平可以提高到" Intermediate
"进一步到" Advanced
"。
问题:
是否有必要实施中间体"通过"具有确定的未定级别列表的模型,还是可以直接在level_of_knowledge
模型的Student
字段中完成?
答案 0 :(得分:1)
就个人而言,我会在这种情况下创建一个中间模型,但如果你想了解更多关于你能做什么的想法,那么这样的事情也会起作用:
Class Student:
advanced_knowledge = model.ManyToMany(Topic)
intermediate_knowledge = model.ManyToMany(Topic)
basic_knowledge = model.ManyToMany(Topic)
...
Class Topic:
...
所以这很简洁,因为您可以使用student.basic_knowledge.all()
但问题出在这里:
如果您想要一个与Topic
相关的所有Student
个对象的列表,该怎么办?你是否将所有这三个问题结合起来?
如果您想添加更多知识水平怎么办?也许以后的学生会有初学者知识或专业知识。您最终会添加多少个其他ManyToMany字段?
使用中间模型解决了这两个问题,并且如果需要,不难使用django through
选项并按级别过滤。只需在Student
上为最常过滤的知识级别创建属性或方法。
Class Student:
level_of_knowledge = model.ManyToMany(Topic, through=MyIntermediteModel)
def advanced_knowledge(self):
return self.level_of_knowledge.filter(...) # filter by intermedite model where level = 'advanced'