Python / django.db:如何在没有硬编码的Meta.db_table的情况下创建泛型类?

问题描述 投票:1回答:1

我有一个使用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 database oop
1个回答
2
投票

我想你问的是一个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,你会发现field1field2field3

有关详细信息,请参阅this

如果你想自己创建一个db_table层次结构(field1field2将在super_class_table中,而field3将在sub_class_table中),你可以使用Multi-table inheritance。如果存在服务合同方案,这将非常有用 - 团队或模块拥有包括db_table及其维护在内的常用功能。但这种方式不太常用。

© www.soinside.com 2019 - 2024. All rights reserved.