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



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

这样写对吗?

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

因为我总是看到它被应用在视图上,但我的视图是基于类的,所以我不能应用这个装饰器。在我看来,把它应用到实际的保存方法中也是合乎逻辑的。其次,事务原子的"深度"是什么,如果我将其应用于视图,我猜它适用于任何来自那里的调用?

根据我的评论,我添加了一个如何在基于类的视图中做到这一点的示例。

你可以使用这样的装饰符:

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

最新更新