2

メタクラスを使用して、Django モデルのデータベース テーブル名をキャメル ケースから「_」で区切られた名前に自動的に設定しています。たとえば、デフォルトの代わりに次のMyGreatModelようなテーブル名が付けられます。appname_my_great_modelappname_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ません。ofでハードコーディングすると、それは実行されます。さらに、実行するSQLを確認すると、区切りテーブル名ではなく、テーブルが作成されることが示されます。db_tableoptionsclass MetaMyGreatModelpython manage.py sqlmigrate...appname_mygreatmodel

ただし、この移行を実行してから Django シェルでモデルを調べると、メタクラスから期待されるようにMyGreatModel._meta.db_table表示されます。my_great_modelCreateModelの属性 0001 init 移行オプションを手動で追加するとdb_table、その後の移行でもすべて問題ありませんが、Django はそれを自動的に行うべきだと思います...

db_tableDjango の移行でここが取り上げられないのはなぜですか?

を使用してDjango==1.10.5います。

助けてくれてありがとう

4

1 に答える 1