我有一个使用django.db的类如下:
from django.db import models
class myClass(models.Model):
"My class"
class Meta:
db_table = 'my_table'
field1 = models.CharField()
# more fields here
def some_function(self):
return "hello"
我想把它变成一个没有“my_table”硬编码的通用类,这样我就可以用某种方式使用它,例如:
class GenericClass(models.Model):
class Meta:
db_table = None
# genericClass properties and methods here
class myClass(GenericClass):
id = models.CharField(max_length=20)
def __init__(self, *args, **kwargs):
super(self.__class__, self).Meta.db_table = 'my_table'
super(self.__class__, self).__init__(*args, **kwargs)
但是,这给了我以下错误(使用Python 2.7 / Django 1.11):
Local field u'id' in class 'myClass' clashes with field of similar name from base class 'GenericClass'
有没有办法创建一个扩展django.db.models.Model的泛型类,它支持非默认的数据库表名而不需要硬编码Meta.db_table?
我想你问的是一个Django等效的AbstractSuperClass / SuperClass。
如果您想要的是用于django模型的AbstractSuperClass,您可以将其定义为
class AbstractModel(models.Model):
field1 = ...
field2 = ...
...
class Meta:
abstract = True
class SubClassModel(models.Model):
field3 = ...
class Meta:
db_table=sub_class_db_table
您的AbstractModel将没有数据库表。它只是作为存储公共字段的超类(甚至可以定义常用函数)。
如果你DESC
你的sub_class_db_table,你会发现field1
,field2
,field3
。
有关详细信息,请参阅this。
如果你想自己创建一个db_table层次结构(field1
和field2
将在super_class_table
中,而field3
将在sub_class_table
中),你可以使用Multi-table inheritance。如果存在服务合同方案,这将非常有用 - 团队或模块拥有包括db_table及其维护在内的常用功能。但这种方式不太常用。