我有一个使用 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 进行硬编码?
最佳答案
我猜你问的是抽象父类(super class)/父类(super class)的 Django 等价物。
如果你想要的是 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 不会有数据库表。它只是作为一个父类(super class)来存储公共(public)字段(甚至您可以定义公共(public)函数)。
如果您DESC
sub_class_db_table,您将找到field1
、field2
、field3
。
参见 this了解更多详情。
如果您想自己创建一个 db_table 层次结构(field1
和 field2
将在 super_class_table
和 field3
将在 sub_class_table
中),您可以使用 Multi-table inheritance .这将非常有用,尤其是在存在服务契约(Contract)场景时 - 团队或模块拥有公共(public)功能,包括 db_table 及其维护。但这种方式不太常用。
关于django - Python/django.db : How to create a generic class without hardcoded Meta. db_table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48201869/