【发布时间】:2021-07-17 00:21:02
【问题描述】:
我正在尝试构建我的第二个 django(以及 python,我的第一个项目是 django 教程 :))项目。因为这应该是真实的,所以在我进入项目的实质之前,我想彻底了解并构建一个良好的代码结构。
我有几个像这样的简单模型
class Task(models.Model):
name = models.CharField(max_length=50, null=False)
description = models.CharField(max_length=255, null=True)
dueDate = models.DateTimeField()
我正在使用 PostgreSQL,我通过像这样定义每个模型的元类来设置我的模型以使用应用程序标签作为数据库模式
class Meta:
managed = True
db_table = 'app_name\".\"modelname'
这很好用。但是我必须对每个模型都这样做。
我想保持干燥。所以我现在要做的是有一个抽象的基类来自动执行此操作 所以我尝试了以下方法:
class SchemaModel(models.Model):
class Meta():
abstract = True
managed = True
db_table = AppConfig.label+'\".\"'+self.__class__.lower()+'s'
(当然,基类随后被继承,我将嵌套的Meta 类从普通模型中取出)
这不起作用,因为在Meta 中无法访问self
在咨询了documentation 之后,我尝试了这个:
class SchemaModel(models.Model):
class Meta():
abstract = True
managed = True
db_table = '%(app_label)\".\"%(class)s'
这导致每个模型的属性db_table 为"%(app_label)\".\"%(class)s"
>>> t = Task()
>>> t._meta.db_table
'%(app_label)"."%(class)s'
>>>
我在互联网上没有找到类似的东西。我是在尝试做一些不可能或“禁止”的事情吗?
解决方案
解决方案如elyas回答中所示,通过循环遍历所有__subclasses__()在models.py末尾设置db_table属性
for model in SchemaModel.__subclasses__():
db_table = '{}s'.format(model._meta.label_lower.replace('.','\".\"'))
model._meta.original_attrs['db_table'] = db_table
model._meta.db_table = db_table
【问题讨论】:
标签: python-3.x django metaclass