django交易

时间:2012-11-28 09:23:22

标签: python django

我有一个代码,就像这样

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会在一个事务中执行所有保存并更少地访问数据库(在一个函数内) ?
  2. 示例:

    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。如果是这样,对于大型查询集会更好吗? 谢谢你们!

1 个答案:

答案 0 :(得分:3)

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

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

如果您的问题是大量保存的性能,您可以使用批量删除/创建方法。这是一个example of it in a project of mine。我们的想法是删除一个查询中的所有对象,然后在一个查询中重新创建所有新值。它不适用于所有情况,但它可能会起作用。