2011-09-21 79 views
9

manage.py syncdbmanage.py syncdb为表格中的模型创建数据库表。如何使manage.py创建格式为modelname的表格?Django syncdb表

是唯一的办法就是增加class Meta: db_table = u'modelname'

+0

我不知道,但可能向南做到这一点。 –

+0

这不是关于创建表的南部,而是关于使用它们的django。所以是,不是。总有一些方法可以克服它,但据我所知,安全和有据可查的方法只是香草酱里面的一种。 – JackLeo

回答

8

是,改变创建的表名的唯一方法是设置db_table到内部元类。

请参阅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 

然后,从ModelWithoutAppName而不是django.db.models.Model继承当你创建你的模型:

class YourModel(ModelWithoutAppName): # database table name will be yourmodel 
    foo = models.IntegerField()