Как и где я должен создать этот транзакционный метод? - PullRequest
0 голосов
/ 21 января 2019

Я использую Python 3.7. В классе обслуживания у меня есть эти заявления ...

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

ArticleStat.objects.save_main_article(article)

Первая пара операторов обновляет атрибут для одного объекта, а вторая инструкция создает группу отдельных объектов, используя первый объект. Я хотел бы, чтобы все это было выполнено как транзакция, при которой все происходит успешно или не происходит никаких изменений в базе данных, если что-то не получается. Мне неясно, как лучше всего использовать Python. Куда пойти такой метод? Помещает ли это класс менеджера в транзакцию?

1 Ответ

0 голосов
/ 21 января 2019
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 , в частности post_save signal.

Посмотрите документы для транзакций здесь: https://docs.djangoproject.com/en/2.1/topics/db/transactions/

...