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_insert 或 force_update ,但这可能会导致严重的数据完整性问题,例如创建重复条目而不是更新现有条目... p>
所以,如果你想使用 force ,你必须确定它是一个 INSERT 还是一个 UPDATE...
【讨论】:
【参考方案2】:尝试使用带有force_insert
或force_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 视图中而不返回 404 的正确方法是啥?