gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:28:14 24 4
gpt4 key购买 nike

我有一个使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com