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

时间:2011-06-07 09:41:34

标签: django save django-mssql

每次在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,只需插入

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

40ins 的答案是对的,但可能会有更高的成本......

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

检查documentatin from here ...

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

所以,如果你想使用强力,你必须确定它是INSERT还是UPDATE ......

答案 2 :(得分:0)

附加选择是django-mssql后端从表中获取标识值以确定刚刚插入的ID。如果此选择很慢,则SQL服务器/配置出现问题,因为它只进行SELECT CAST(IDENT_CURRENT(*table_name*) as bigint)调用。