我应如何以及在何处创建此事务处理方法?

时间:2019-01-20 21:35:24

标签: python django python-3.x model transactional

我正在使用Python 3.7。在服务类中,我有以下语句...

article.first_appeared_date = datetime.now(timezone.utc)
article.save()

ArticleStat.objects.save_main_article(article)

第一对语句更新单个对象的属性,第二对语句使用第一个对象创建一堆单独的对象。我想要的是将整个事情作为事务执行,从而一切都成功了,或者如果某件事失败了,则不会对数据库进行任何更改。我不清楚Python的最佳做法。这样的方法会去哪儿?放在管理器类中是否使其具有事务性?

1 个答案:

答案 0 :(得分:0)

from django.db import transaction

 with transaction.atomic():
    article.first_appeared_date = datetime.now(timezone.utc)
    article.save()

    ArticleStat.objects.save_main_article(article)

您可以在某些模型中甚至从服务调用的视图中实现此目的的方法。大多数时候,您希望将这样的代码放在某个视图中(或在视图中调用的函数)。

但是,如果您想要的是每次ArticleStat.objects.save_main_article(article)都执行save,则应该查看Django signals,特别是post_save信号。

在此处查看交易文档:https://docs.djangoproject.com/en/2.1/topics/db/transactions/