Django syncdb表的自定义名称

Jib*_*bin 9 django

manage.py syncdb为表单中的模型创建数据库表.appname_modelname如何使manage.py以格式创建表modelname?

是唯一的方法是添加 class Meta: db_table = u'modelname'

and*_*lme 8

是的,更改已创建表的名称的唯一方法是将db_table设置为内部Meta类.

请参阅https://docs.djangoproject.com/en/dev/ref/models/options/#table-names.


然而,有了一些元类魔法,它实际上可以做你想要的.这个例子只是为了表明它是可能的,因为Python是一个很好的语言.它可以打破Django的新版本(尽管不太可能),因为ModelBase和_meta没有正式记录的AFAIK.我会坚持在你的模型中手动添加db_table.

通过创建构造模型类的自定义元类,可以更改内部元类的db_table属性.

from django.db import models
from django.db.models.base import ModelBase

class ModelWithoutAppNameBase(ModelBase):
    def __new__(cls, name, bases, attrs):
        model = super(ModelWithoutAppNameBase, cls).__new__(cls, name, bases, attrs)
        model._meta.db_table = name.lower()
        return model


class ModelWithoutAppName(models.Model):
    __metaclass__ = ModelWithoutAppNameBase
Run Code Online (Sandbox Code Playgroud)

然后继承ModelWithoutAppName而不是django.db.models.Model在创建模型时继承:

class YourModel(ModelWithoutAppName):  # database table name will be yourmodel
   foo = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)