Миграции Django игнорируют db_table при установке с использованием метакласса
Я использую метакласс, чтобы автоматически устанавливать имена таблиц БД модели Django из верблюжьего случая в имена с разделением '_', например MyGreatModel
будет иметь имя таблицы как appname_my_great_model
вместо по умолчанию appname_mygreatmodel
:
class PrettyModelBase(ModelBase):
def __new__(cls, name, bases, attrs):
super_new = ModelBase.__new__(cls, name, bases, attrs)
module_name = camel_to_underscore(name)
model_module = sys.modules[cls.__module__]
app_label = super_new.__module__.split('.')[-2]
db_table = '%s_%s' % (app_label, module_name)
if not getattr(super_new._meta, 'proxy', False):
super_new._meta.db_table = db_table
return super_new
class BaseModel(models.Model):
__metaclass__ = PrettyModelBase
class Meta:
abstract = True
class MyGreatModel(BaseModel):
somefield = models.TextField(default="")
Однако миграция, кажется, не подхватывает это db_table
название. Если я запускаю makemigrations, то CreateModel
не показывает db_table
в options
для этой модели. Если я жестко закодирую это в class Meta
из MyGreatModel
тогда это делает. Более того, если я проверю SQL для запуска с python manage.py sqlmigrate...
тогда это показывает, что это создаст appname_mygreatmodel
таблица, а не имя таблицы с разделителями.
Однако если я выполню эту миграцию, а затем изучу модель в оболочке Django, то MyGreatModel._meta.db_table
шоу my_great_model
как и следовало ожидать от моего метакласса. Если я вручную добавлю db_table
Присвойте опции миграции 0001 init для CreateModel, тогда все в порядке и для последующих миграций, но Django должен делать это автоматически, я думаю...
Почему миграция Джанго не набирает db_table
Вот?
я использую Django==1.10.5
,
Спасибо за любую помощь
0 ответов
Этот вопрос был повторно поднят в списке рассылки django-developers: https://groups.google.com/forum/#!msg/django-developers/ncMCwMF2J3g/V3guuDbJCwAJ
Django миграции использует model._meta.original_attrs
для определения определения метакласса: https://github.com/django/django/blob/stable/2.2.x/django/db/migrations/state.py
Таким образом, если вы динамически мутируете model._meta
после создания вам также необходимо изменить его original_attrs
dict соответственно. Я думаю, что это должно работать (не проверено).