django - Python/django.db : How to create a generic class without hardcoded Meta. db_table?

标签 django database oop

我有一个使用 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,您将找到field1field2field3

参见 this了解更多详情。

如果您想自己创建一个 db_table 层次结构(field1field2 将在 super_class_tablefield3 将在 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/

相关文章:

python - 使用帐户身份验证来验证是否已登录

python - 使用 SUDS Python WSDL 客户端和 Django Sentry,带有 __sentry__ 属性的异常

选择 'Next' 记录的 SQL 查询(类似于 First 或 Top N)

database - 如何使用 bash shell 中的 psql 命令执行多个查询?

java - Setter 没有为 java 对象设置值

design-patterns - 设计模式仅适用于面向对象的设计吗?

python - Django 表单字段标签翻译

django - 是否可以在多个级别上预取相关?

database - 如何编写 SQL Server 标量函数来计算总和?

java - 访问 protected 成员时出错