是否必须指定中间模型来描述' level'多对多的关系?

时间:2015-12-02 13:50:30

标签: django django-models many-to-many

刚接触Django并且对python来说比较新,我正在编写一个知识报告网页。

我有两个具有已定义的MtM关系的模型:

Class Student:
level_of_knowledge = model.ManyToMany(Topic)
...

Class Topic:
...

预期用途: 每个学生对每个主题都有一定程度的理解(每个主题的主题列表都完全相同),从" Basic"开始。理解水平可以提高到" Intermediate"进一步到" Advanced"。

问题: 是否有必要实施中间体"通过"具有确定的未定级别列表的模型,还是可以直接在level_of_knowledge模型的Student字段中完成?

1 个答案:

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

轻松访问某个级别的知识

但问题出在这里:

  1. 如果您想要一个与Topic相关的所有Student个对象的列表,该怎么办?你是否将所有这三个问题结合起来?

  2. 如果您想添加更多知识水平怎么办?也许以后的学生会有初学者知识或专业知识。您最终会添加多少个其他ManyToMany字段?

  3. 使用中间模型解决了这两个问题,并且如果需要,不难使用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'