Django:多对多,通过vs 2x一对多

时间:2012-04-23 22:38:49

标签: sql django orm many-to-many relational-database

阅读,当你需要在中间表上增加一个字段时,Django会记录多对多关系,我不清楚你通过将关系定义为多对多而只是拥有一个外键来获得什么到每个模型中的中间模型。

例如,在此示例中:https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

为什么要烦扰ManyToManyField系列?它是否允许您以不同的方式引用关系?它会改变管理员的内容吗?

1 个答案:

答案 0 :(得分:1)

为什么要担心ManyToManyField line:M2M字段是django fields,它们对许多模型字段接口很有用,例如ModelAdminModelForm(声明字段,不包括默认小部件) )。它还生成辅助方法,如易于访问m2m管理器和管理员中的自动m2m保存。

以下是该字段为管理面板自动执行的操作的快速示例:如果不先保存主对象,则无法保存直通模型。在自动保存主对象后,管理员使用save_m2m处理此行为。如果你没有使用m2m字段,你必须自己编写这种逻辑。

我认为当你的项目使用m2m字段时你会使用这个字段,但你只需要少量的附加信息。这样你的代码几乎与典型的m2m关系相同,但是当你需要它时,你可以查询额外的信息。

否则,添加仅仅“date_added”字段将需要编写管理窗口小部件,save_model挂钩,ModelForm表示等。

你是对的,虽然用直通模型删除m2m行不会进行任何数据库更改,你最终可以用默认的ForeignKey反向管理器替换m2mfield功能而不会有太大的伤害。

model.m2m_through_set.all() # this would work
model.m2m_through_set.create(target=target_instance)