是否必须指定中间模型来描述'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()
轻松访问特定级别的知识
但问题是:
如果您想要一个包含与 Student
相关的所有 Topic
对象的列表怎么办?您是否组合了所有这三个查询?
如果你想多加几层知识怎么办?也许以后的学生会有初学者知识或专家知识。您最终会添加多少个 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'
作为 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()
但问题是:
如果您想要一个包含与
Student
相关的所有Topic
对象的列表怎么办?您是否组合了所有这三个查询?如果你想多加几层知识怎么办?也许以后的学生会有初学者知识或专家知识。您最终会添加多少个 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'