在表单内部应用事务原子是否正确?

时间:2016-08-09 04:42:50

标签: django forms transactions save atomic

我有一个ModelForm,我想覆盖save()方法来创建相关对象。我需要transaction.atomic()

这样应用是否正确:

class MyForm(ModelForm):
    @transaction.atomic
    def save(self, commit):
         self.instance.save()
         # and create related objects using self.instance..

因为我一直看到它已应用于视图,但我的视图是基于类的,因此我无法应用此装饰器。对于我来说,将它应用于执行保存的实际方法似乎也是合乎逻辑的。 第二,什么是深度'事务原子,如果我将它应用于视图,我想它适用于那里的任何调用?

1 个答案:

答案 0 :(得分:2)

根据我的评论,我在基于类的视图中添加了如何执行此操作的示例。

您可以使用这样的装饰器:

class YourView(View):
    @transaction.atomic
    def post(self, request, *args, **kwargs):
        ...

或者你可以做得更好:

class YourView(View):
    def post(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                your_model = form.save()
                generate_relationships()
        except IntegrityError:
            handle_exception()

或者你可以同时使用两者。

参考:django transactions docs