python - 我应该如何以及在哪里创建此事务方法?

标签 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 的最佳实践。这样的方法会去哪里呢?将其放入管理器类中是否可以使其具有事务性?

最佳答案

from django.db import transaction

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

    ArticleStat.objects.save_main_article(article)

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

但是,如果您想要的是每次保存文章时执行ArticleStat.objects.save_main_article(article),您应该查看 Django signals ,具体来说post_save信号。

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

关于python - 我应该如何以及在哪里创建此事务方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281215/

相关文章:

django - 如何通过AWS Elastic Beanstalk可扩展的Django应用程序运行 celery worker ?

python - 'str' 对象不可调用 Django Rest Framework

python - django:从 View 返回图像数据

python - 如何在 Django 中使用 Hardcopy 在选定的目录中创建 pdf 输出文件?

python - 将整个 Python 应用程序打包为 PEX 文件

python - 使用 feedparser 从博客中获取每个独特的项目。检查 for 循环中的列表成员身份不起作用

python - 为什么 tkinter 不让我使用 tk.StringVar()?

python - Pytest Xdist 不同的测试被收集错误

python:无噪音 3-D 旋转?

python - 如何在 Python 中正确获取异常消息