在Django中更改表名

时间:2013-11-24 20:40:15

标签: python django

我已经读过可以使用Meta Options自定义Django中的表名。我想知道如何使用db_table选项继续使用应用程序名称,但稍微修改模型名称而不对应用程序名称进行硬编码。

例如,在Django教程中,应用程序名称为“polls”,模型名称为“poll”。让我们说我希望这个表被称为“polls_mypoll”而不是“polls_poll”。这是我尝试过的,但无法访问外部类(轮询未定义)

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    class Meta:
        db_table = "%s_%s" % (Poll._meta.app_label, "mypoll")

同样,如果我想明确定义db_table只是默认的polls_poll怎么办?我知道我可以完全放弃Meta类,并且会使用默认名称,但是如果我想明确它呢?

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    class Meta:
        db_table = "%s_%s" % (Poll._meta.app_label, Poll._meta.model_name)

这不起作用,因为Poll未在Meta中定义。

2 个答案:

答案 0 :(得分:0)

您获得的异常Poll is not defined是由db_table = "%s_%s" % (Poll._meta.app_label, Poll._meta.model_name)语句在引用Poll类时仍在构造(尚未插入全局范围)引起的。如果您想在Poll中使用对db_table的引用,请考虑编写自己继承自ModelBase的元类,并正确设置_meta.db_table值。此时,Poll名称将不可用,但实际对象将被构建并在您手中操纵。

答案 1 :(得分:0)

您始终可以从全局名称空间中提取app_label

class Meta:
    db_table = "%s_%s" % (__package__, "mypoll")

这会假设您的models.py文件相对于应用程序YMMV的位置。

一种替代方法是从 globals() 中提取名称:

# determine where app_label is
# print(globals()) 
# {'__name__': 'myapp.models', '__doc__': None, ...

app_label, *_ = globals()['__name__'].partition('.')

# or simply
app_label, *_ = __name__.partition('.')

class Meta:
    db_table = "%s_%s" % (app_label, "mypoll")

您的第二个例子对我来说是不可理解的。您正在尝试使用对对象的硬编码引用来找到对象的名称,即。您正在使用它的名称来尝试查找...它的名称...吗?