【问题标题】:How and where should I create this transactional method?我应该如何以及在哪里创建这种事务方法?
【发布时间】:2019-06-14 07:50:04
【问题描述】:

我正在使用 Python 3.7。在服务类中,我有这些陈述......

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

ArticleStat.objects.save_main_article(article)

第一对语句更新单个对象的属性,第二个语句使用第一个对象创建一堆单独的对象。我想要的是把整个事情作为一个事务来执行,这样一切都会成功,或者如果出现故障,数据库不会发生任何变化。我不清楚 Python 的最佳实践。这样的方法会去哪里?将其放入管理器类是否会使其具有事务性?

【问题讨论】:

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


【解决方案1】:
from django.db import transaction

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

    ArticleStat.objects.save_main_article(article)

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

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

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

【讨论】:

  • 谢谢。我列出的代码出现在服务类中。在我使用过的其他框架中,似乎事务代码应该放在 DAO 类或模型中。 Django 中事务逻辑的最佳位置是什么?
  • @Dave 我已经编辑了我的答案,以解决您关于事务逻辑的最佳位置的问题,请注意事务逻辑不是实现您想要的东西的必要条件。
  • 在您的编辑中,您提到了“post_save”,但是否实现了同样的目标?在常规保存成功的情况下,post_save 中的某些内容不会失败吗?
  • 是的,你完全正确。如果您需要在 ArticleStat.objects.save_main_article 失败时回滚更改,只需坚持答案的第一部分并使用事务上下文管理器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多