每次在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,只需插入
答案 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)
调用。