我有一个代码,就像这样
def many_objects_saving(list_of_objects):
for some_object in list_of_objects:
# do smth with an object
some_object.save()
据我所知,django每次在代码中达到save()时都会打到数据库。所以这里有两个问题:
transaction.commit_on_success
或transaction.commit_manually
装饰器进行包装,那么django会在一个事务中执行所有保存并更少地访问数据库(在一个函数内) ?示例:
def resave_objects(model, condition):
list_of_objects = model.objects.filter(**condition)
many_objects_save(list_of_objects)
@transaction.commit_on_success
def many_objects_save(list_of_objects):
for some_object in list_of_objects:
# do smth with an object
some_object.save()
2。如果是这样,对于大型查询集会更好吗? 谢谢你们!
答案 0 :(得分:3)
所有保存都将包装到单个事务中,但不包含在单个查询中。使用事务不会更改您执行的查询次数。
交易不是为了提高性能,而是为了数据完整性。如果您将视图包装在事务中并在某些时候失败(可能中间的某些数据是错误的并且您无法从错误中恢复),则可以中止事务,并且事务中的所有先前查询都不会会对数据库产生任何影响。这样,您可以确保没有来自失败请求的半生不熟的数据。
如果您的问题是大量保存的性能,您可以使用批量删除/创建方法。这是一个example of it in a project of mine。我们的想法是删除一个查询中的所有对象,然后在一个查询中重新创建所有新值。它不适用于所有情况,但它可能会起作用。