Отключить атомарную транзакцию в Django 1.11. - PullRequest
0 голосов
/ 08 января 2019

Django 1.11 имеет следующий фрагмент кода

@csrf_protect_m
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    with transaction.atomic(using=router.db_for_write(self.model)):
        return self._changeform_view(request, object_id, form_url, extra_context)

в

env/lib/python3.6/site-packages/django/contrib/admin/options.py

Согласно doc Предполагается, что Django 1.11 работает в режиме автоматической фиксации, но changeform_view, похоже, не соответствует документации. Сохранение формы администратора Django происходит внутри транзакции.

Я решил, переопределив метод в классе ModelAdmin модели.

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    return self._changeform_view(request, object_id, form_url, extra_context)

Но есть ли способ включить режим автоматической фиксации формы django для всех моделей с настройкой?

1 Ответ

0 голосов
/ 09 января 2019

Вы неправильно поняли документацию .

По умолчанию Django работает в режиме автоматической фиксации.

«Поведение по умолчанию» здесь означает «поведение при отсутствии конкретных указаний по объему транзакции». В приведенном вами changeform_view код явно использует API транзакции, указывая на то, что он не хочет использовать режим автоматической фиксации по умолчанию.

Обратите внимание, что ваши изменения не гарантируют, что код работает в режиме автоматической фиксации. Это связано с тем, что любая из функций, вызываемых из _changeform_view, может самостоятельно использовать API транзакции, что отключает автоматическую фиксацию. Многие части Django используют транзакции, потому что они необходимы для обеспечения правильного поведения.

Так что нет никакого параметра или другого метода для отключения API транзакций во всем Django.

...