Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django交易_Python_Django - Fatal编程技术网

Python django交易

Python django交易,python,django,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()时都会命中数据库。所以这里有两个问题: 如果我将在另一个函数中使用此函数,并将其包装为transaction.commit\u on\u

我有一个密码,类似这样的

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\u on\u success
    transaction.commit\u手动
    decorators,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()
    
    二,。如果是这样的话,对大型QuerySet来说会更好吗?
    谢谢你们

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

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

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