Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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
如何在Django视图中执行多个保存对象调用,但仅提交一次_Django_Model_Save_Commit - Fatal编程技术网

如何在Django视图中执行多个保存对象调用,但仅提交一次

如何在Django视图中执行多个保存对象调用,但仅提交一次,django,model,save,commit,Django,Model,Save,Commit,我有一个Django视图,在该视图中,我在多个点的单个对象中(有条件地)调用my_model.save()my_model是一个普通的模型类 save()。为了防止这种情况,我定义了一个布尔变量save\u model,并在修改对象时将其设置为True。在视图的末尾,我检查这个布尔值,并在需要时对我的对象调用save 有没有更简单的方法?我尝试了Djangostransaction.commit\u on\u success作为视图装饰器,但save调用似乎已排队并提交。您可以在代码中的任何地方

我有一个Django视图,在该视图中,我在多个点的单个对象中(有条件地)调用
my_model.save()
my_model
是一个普通的模型类

save()。为了防止这种情况,我定义了一个布尔变量
save\u model
,并在修改对象时将其设置为
True
。在视图的末尾,我检查这个布尔值,并在需要时对我的对象调用
save


有没有更简单的方法?我尝试了Djangos
transaction.commit\u on\u success
作为视图装饰器,但save调用似乎已排队并提交。

您可以在代码中的任何地方使用事务支持,Django文档明确地说:

尽管下面的示例使用视图函数作为示例,但这些装饰器和上下文管理器可以在代码中处理事务所需的任何位置使用

但这不是交易的目的。您可以使用一些现有的应用程序删除布尔变量,如


但它闻起来像一个糟糕的设计。为什么需要多次调用
save
?您确定不能只调用一次吗?

您可以在代码中的任何地方使用事务支持,Django文档明确地说:

尽管下面的示例使用视图函数作为示例,但这些装饰器和上下文管理器可以在代码中处理事务所需的任何位置使用

但这不是交易的目的。您可以使用一些现有的应用程序删除布尔变量,如

但它闻起来像一个糟糕的设计。为什么需要多次调用
save
?你确定没有办法只叫它一次吗?

你可以看看

只需使用
DirtyFieldsMixin
作为模型的混音。然后,在执行可查看的
save()
之前,您将能够检查对象是否已更改(使用
obj.is_dirty()


只需使用
DirtyFieldsMixin
作为模型的混音。在执行
save()

之前,您将能够检查对象是否已更改(使用
obj.is_dirty()
)。。。但他们是相似的。。。第一个是在返回响应之前调用
save()

def my_view(request):
    obj = Mymodel.objects.get(...)
    if cond1:
        obj.attr1 = True
    elif cond2:
        obj.attr2 = True
    else:
        obj.attr1 = False
        obj.attr2 = False
    obj.save()
    return .......
第二个是你的方法


但除了定义自己的装饰器或其他方法外,没有其他方法可以做到这一点,但事实上,您需要检查模型是否有任何修改(或者您希望保存对数据的更改)。

有两种方法可以做到这一点。。。但他们是相似的。。。第一个是在返回响应之前调用
save()

def my_view(request):
    obj = Mymodel.objects.get(...)
    if cond1:
        obj.attr1 = True
    elif cond2:
        obj.attr2 = True
    else:
        obj.attr1 = False
        obj.attr2 = False
    obj.save()
    return .......
第二个是你的方法


但除了定义自己的装饰器或其他方法之外,没有其他方法可以做到这一点,但事实上,您需要检查模型是否有任何修改(或者您希望保存对数据的更改)。

谢谢,我不知道这一点。非常有用。。。无论如何,在我的简单例子中,我坚持使用布尔型,因为DirtyFieldsMixin有点过分了。谢谢,我不知道。非常有用。。。无论如何,在我的简单例子中,我坚持使用布尔值,因为DirtyFieldsMixin在这方面有点过分。我在整个视图中使用了commit_on_success,数据库提交被推迟到视图的成功结束,但仍然有一个按顺序获得对数据库的多个调用。无论如何,在大多数情况下,对象根本没有保存,这就是我使用布尔值的原因。@Nasmon如果在大多数情况下,对象根本没有保存,为什么总是调用它的
save
?模型只保存,当我的bool变量为true时,我在整个视图上使用了commit_on_success,数据库提交被推迟到视图的成功结束,但仍有一个视图会依次获得对数据库的多个调用。无论如何,在大多数情况下,对象根本没有保存,这就是我使用布尔值的原因。@Nasmon如果在大多数情况下,对象根本没有保存,为什么您总是调用它的
save
?只有当我的bool变量为true时,模型才会保存。您误解了事务的工作方式。在一个事务中,所有的操作仍然被发送到数据库——只是在事务提交之前,数据库会隔离这些操作。哦!谢谢你的澄清!!您误解了事务是如何工作的。在一个事务中,所有的操作仍然被发送到数据库——只是在事务提交之前,数据库会隔离这些操作。哦!谢谢你的澄清!!