Миграции 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_attrsdict соответственно. Я думаю, что это должно работать (не проверено).

Другие вопросы по тегам