1

我有一个代码,像这样

def many_objects_saving(list_of_objects):
    for some_object in list_of_objects:
        # do smth with an object
        some_object.save()

据我所知,django 每次在代码中到达 save() 时都会访问数据库。所以这里有两个问题:

  1. 如果我将在另一个函数中使用这个函数并用transaction.commit_on_successtransaction.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. 如果是这样,对于大型查询集会更好吗?谢谢你们!

4

1 回答 1

3

所有保存都将包装到单个事务中,但不在单个查询中。使用事务不会更改您执行的数字查询。

事务不是为了性能,而是为了数据完整性。如果您将视图包装在事务中并在某个时刻失败(可能中间的某些数据是错误的,您无法从错误中恢复),则可能会中止事务,并且事务中之前的查询都没有将对数据库产生任何影响。这样,您可以确保您没有来自失败请求的半生不熟的数据。

如果您的问题是大量保存的性能,您可以使用批量删除/创建方法。这是我的一个项目中的一个例子。这个想法是您在一个查询中删除所有对象,然后在一个查询中重新创建它们的所有新值。它不会在所有情况下都有效,但它可能会奏效。

于 2012-11-28T10:05:32.707 回答