Django mysql динамическое создание таблиц при сохранении модели

Я хотел бы создавать дополнительные таблицы, когда я вызываю Model.save() (INSERT). Но я продолжаю получать эту ошибку:

django.db.transaction.TransactionManagementError: Выполнение DDL операторов во время транзакции на базах данных, которые не могут выполнять откат запрещен.

Я пытался создать дополнительные таблицы внутри Model.save() и используя сигнал pre_save(), я получаю ту же ошибку.

Это попытка решения до сохранения:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.db import connection
    @receiver(pre_save, sender=MyModel, dispatch_uid="create_tags")
    def create_tags(sender, instance, **kwargs):
        print("debug, signal pre_save works") 
        try:
            # if obj exists in MyModel table, skip tag table creation
            existing_obj = MyModel.objects.get(name=instance.name)
            print("debug, obj exists")
        except MyModel.DoesNotExist:
            with connection.schema_editor() as schema_editor:
                schema_editor.create_model(MyModel2)

Стек: Django, MySQL.

Я хотел реализовать создание дополнительных таблиц для вставляемого экземпляра.

Временно установить schema_editor.connection.in_atomic_block = False.

with connection.schema_editor() as schema_editor:
    in_atomic_block = schema_editor.connection.in_atomic_block
    schema_editor.connection.in_atomic_block = False
    try:
        schema_editor.create_model(MyModel2)
    finally:
        schema_editor.connection.in_atomic_block = in_atomic_block

Использование контекстного менеджера:

with connection.schema_editor() as schema_editor:
    with non_atomic(schema_editor):
        schema_editor.create_model(MyModel2)
from contextlib import contextmanager


@contextmanager
def non_atomic(schema_editor):
    in_atomic_block = schema_editor.connection.in_atomic_block
    schema_editor.connection.in_atomic_block = False
    try:
        yield
    finally:
        schema_editor.connection.in_atomic_block = in_atomic_block
Вернуться на верх