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

Is it mandatory to specify intermediate model to describe 'level' of many-to-many relationship?

作为 Django 的新手和 python 的新手,我正在编写一个知识报告网页。

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

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

Class Topic:
...

预期用途: 每个学生对每个主题都有一定程度的理解(每个人的主题列表完全相同),例如从“Basic”开始。理解水平可能会增加到“Intermediate”,并进一步增加到“Advanced”。

问题: 是否有必要实施具有确定的理解水平列表的中间 "through" 模型,或者是否可以直接在 Student 模型的 level_of_knowledge 字段中完成?

就我个人而言,在这种情况下,我会创建一个中间模型,但如果您想了解更多关于您可以做什么的想法,那么类似的方法也可以:

Class Student:
    advanced_knowledge = model.ManyToMany(Topic)
    intermediate_knowledge = model.ManyToMany(Topic)
    basic_knowledge = model.ManyToMany(Topic)
    ...

Class Topic:
    ...

所以这很好,因为您可以使用 student.basic_knowledge.all()

轻松访问特定级别的知识

但问题是:

  1. 如果您想要一个包含与 Student 相关的所有 Topic 对象的列表怎么办?您是否组合了所有这三个查询?

  2. 如果你想多加几层知识怎么办?也许以后的学生会有初学者知识或专家知识。您最终会添加多少个 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'