在 Django 中插入多对多对象的正确方法?

Posted

技术标签:

【中文标题】在 Django 中插入多对多对象的正确方法?【英文标题】:Correct way to insert Many-to-Many objects in Django? 【发布时间】:2011-03-25 18:57:19 【问题描述】:

我正在研究一个带有额外字段的多对多模型,我看到了文档 for extra fields in many to many relations

以他们为例,创建他们使用的会员资格

m2 = Membership.objects.create(person=paul, group=beatles,date_joined=date(1960, 8, 1), invite_reason= "Wanted to form a band.")

但这意味着他们已经有了“person”和“group”实例。通常在网站上工作,我们有对象的 id...所以要创建一个成员,我必须这样做:

person = Person.objects.get(pk=idPerson)
group = Group.objects.get(pk=idgroup)

现在,如果我错了,请纠正我,但我们不是在插入前两次毫无意义地咨询数据库吗?因为,我们在 Membership 中需要的只是外键 ID,而不是整个对象...... 也许还有另一种方法可以仅使用 id 插入多对多关系

【问题讨论】:

【参考方案1】:

嗯,你从哪里得到id_personid_group?如果没有他们所属的个人或团体,他们就不会存在,对吧?我的意思是要获取此人的 id,您将从 您已经可以访问的人开始

在使用 Django 时,您可以安全地停止从数据库的角度思考,并将您的想法更多地与您拥有的对象保持一致。

无论如何,Django 不会访问数据库,除非它遇到它绝对必须这样做的点。

【讨论】:

好吧...如果您从表单发送的 POST 或 GET 变量中获取 id_person 和 id_group 怎么办?通过 Ofri Raviv 的回答,我可以创建 Membership 对象,而不必在每个 Person 和 Group 对象上调用“get”方法,这样我就可以确定 django 只访问数据库一次。我正在处理数百万行,所以我想确保我使用 django 是最有效的方式 =)【参考方案2】:

你可以使用

Membership.objects.create(person_id=person_id, group_id=group_id)

其中 person_id 和 group_id 是您要链接的对象的 ID。

【讨论】:

以上是关于在 Django 中插入多对多对象的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

Python入门自学进阶-Web框架——6Django的ORM-多对多admin应用

Django 从多对多关系中删除对象

Django:通过另一个多对多关系访问多对多对象

从 Django QuerySet 中获取所有相关的多对多对象

在 Django admin 中添加内联多对多对象

如何在多对多Django中列出对象