Подтвердить что ты не робот

Как работают атомные запросы Django?

Я бы хотел, чтобы мои представления Django были атомарными. Я имею в виду, если в представлении есть 2 DB-записи, я хочу либо написать 0, либо 2 записи.

Например:

def test_view(request):
    ''' A test view from views.py '''

    MyClass.objects.create()
    raise Exception("whatever")
    MyClass.objects.create()

То, что я нашел в документации, казалось многообещающим:

Общим способом обработки транзакций в Интернете является обертывание каждого запроса в транзакции. Установите ATOMIC_REQUESTS в значение True в конфигурации каждая база данных, для которой вы хотите включить это поведение.

Это работает так. Перед вызовом функции просмотра Django запускает сделка. Если ответ создается без проблем, Django совершает транзакцию. Если представление создает исключение, Django откат транзакции.

Однако, даже если я устанавливаю ATOMIC_REQUESTS = True, при вызове test_view() создается первый объект MyClass! Что мне не хватает?

Примечание. Я использую Django 1.7

4b9b3361

Ответ 1

ATOMIC_REQUESTS - это атрибут параметров подключения к базе данных dict, а не настройки верхнего уровня. Итак, например:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
        'ATOMIC_REQUESTS': True,
    }
}