我已经读过可以使用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中定义。
答案 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")
您的第二个例子对我来说是不可理解的。您正在尝试使用对对象的硬编码引用来找到对象的名称,即。您正在使用它的名称来尝试查找...它的名称...吗?