Django - 是模型save()方法懒吗?
问题描述:
是django中的模型save()方法吗?
Are model save() methods lazy in django?
例如,下面的代码示例中的什么行将django命中数据库?
For instance, at what line in the following code sample will django hit the database?
my_model = MyModel()
my_model.name = 'Jeff Atwood'
my_model.save()
# Some code that is independent of my_model...
model_id = model_instance.id
print (model_id)
答
$ b b
有一个延迟保存没有什么意义,是吗? Django的 QuerySets
是懒惰的,模型的 save
方法不是。
It does not make much sense to have a lazy save, does it? Django's QuerySets
are lazy, the model's save
method is not.
从django源:
django / db / models / base.py
,第424-437行:
django/db/models/base.py
, lines 424–437:
def save(self, force_insert=False, force_update=False, using=None):
"""
Saves the current instance. Override this in a subclass if you want to
control the saving process.
The 'force_insert' and 'force_update' parameters can be used to insist
that the "save" must be an SQL insert or update (or equivalent for
non-SQL backends), respectively. Normally, they should not be set.
"""
if force_insert and force_update:
raise ValueError("Cannot force both insert and updating in \
model saving.")
self.save_base(using=using, force_insert=force_insert,
force_update=force_update)
save.alters_data = True
然后, save_base
执行重载(同一文件,行号439-545):
Then, save_base
does the heavy lifting (same file, lines 439–545):
...
transaction.commit_unless_managed(using=using)
...
并且在 django /db/transaction.py
,第167-178行,您会发现:
And in django/db/transaction.py
, lines 167–178, you'll find:
def commit_unless_managed(using=None):
"""
Commits changes if the system is not in managed transaction mode.
"""
...
$ b b
PS所有行号适用于django版本(1,3,0,'alpha',0)
。