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