1

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

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

有没有更简单的方法来做到这一点?我尝试将 Djangostransaction.commit_on_success作为视图装饰器,但无论如何保存调用似乎都会排队并提交。

4

3 回答 3

2

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

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

但这不是交易的目的。您可以使用一些现有的应用程序来摆脱布尔变量,例如django-dirtyfields

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

于 2012-05-28T09:05:32.373 回答
2

您可以查看django-dirtyfields

只需将DirtyFieldsMixin其用作模型的 mixin。然后,您将能够obj.is_dirty()在执行save().

于 2012-05-28T09:06:23.573 回答
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 .......

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

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

于 2012-05-28T09:08:36.287 回答