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

时间:2012-05-28 08:58:02

标签: django model save commit

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

在Django中立即提交

save(),因此,在最坏的情况下,数据库会被多次命中。为了防止这种情况,我定义了一个布尔变量save_model,并在对象修改的情况下将其设置为True。在我的视图结束时,我检查了这个布尔值并在需要的对象上调用save

有更简单的方法吗?我尝试使用Djangos transaction.commit_on_success作为视图装饰器,但是保存调用似乎仍然排队并提交。

3 个答案:

答案 0 :(得分:2)

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

  

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

但这不是交易所针对的事情。你可以使用一些现有的app来摆脱你的布尔变量,比如django-dirtyfields

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

答案 1 :(得分:2)

您可以查看django-dirtyfields

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

答案 2 :(得分:0)

这可以有两种方法......但它们是相似的......第一种方法是在返回响应之前调用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 .......

第二个是你的方法......

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