Django - 插入而不返回已保存对象的 ID

Posted

技术标签:

【中文标题】Django - 插入而不返回已保存对象的 ID【英文标题】:Django - Insert Without Returning the Id of the Saved Object 【发布时间】:2011-06-07 09:41:34 【问题描述】:

每次在 Django 对象上调用 save() 方法时,Django 都会执行两个查询,一个是 INSERT,一个是 SELECT。在我的情况下,这很有用,除了某些每个查询都很昂贵的特定地方。关于如何有时声明不需要返回任何对象的任何想法 - 不需要 SELECT

另外我是用django-mssql连接的,这个问题在mysql上好像不存在。

编辑:更好的解释

h = Human()
h.name='John Foo'
print h.id # Returns None, No insert has been done therefore no id is available
h.save()
print h.id # Returns the ID, an insert has taken place and also a select statement to return the id

有时我不需要重新输入 ID,只需插入

【问题讨论】:

嗯,这很奇怪,MSSQL 支持INSERT...OUTPUT,所以我不明白它为什么会发出两个查询,但我又对django-mssql 不太熟悉。也许您可以为昂贵的查询构建自己的 INSERT 语句? 【参考方案1】:

40ins的回答是对的,但可能成本可能更高...

django 执行 save() 时,需要确定对象是新对象还是现有对象。因此它会访问数据库以检查相关的 objext 是否存在。如果是,则执行 UPDATE,否则执行 ISERT

检查documentatin from here...

您可以使用 force_insertforce_update ,但这可能会导致严重的数据完整性问题,例如创建重复条目而不是更新现有条目... p>

所以,如果你想使用 force ,你必须确定它是一个 INSERT 还是一个 UPDATE...

【讨论】:

【参考方案2】:

尝试使用带有force_insertforce_update 属性的save() 方法。有了这个属性,django 就知道记录的存在并且不进行额外的查询。

【讨论】:

问题不在于 django 是否检查存在性,而是在每个 INSERT 之后运行一个 SELECT 语句只是为了方便使用 id 对象。【参考方案3】:

额外的选择是 django-mssql 后端从表中获取标识值以确定刚刚插入的 ID。如果这个选择很慢,那么你的 SQL 服务器/配置有问题,因为它只是在做SELECT CAST(IDENT_CURRENT(*table_name*) as bigint) 调用。

【讨论】:

以上是关于Django - 插入而不返回已保存对象的 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 django 立即保存而不是在循环后进行批量更新

如何在 django 中返回在枕头中生成的图像而不保存在数据库中?

Django 表单字段验证 - 如何判断操作是插入还是更新?

验证对象是不是存在于 django 视图中而不返回 404 的正确方法是啥?

验证对象是不是存在于 django 视图中而不返回 404 的正确方法是啥?

如何通过 JPA 获取已保存对象的 id?