2

每次save()在 Django 对象上调用该方法时,Django 都会执行两个查询 1INSERT和 1 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,只需插入

4

3 回答 3

0

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

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

从这里检查文档...

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

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

于 2011-06-07T15:40:21.637 回答
0

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

于 2011-06-07T14:12:21.820 回答
0

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

于 2012-01-18T21:29:08.530 回答