基本上,我的问题源于需要创建从主基类分支的多个模型。这些模型中的每一个都有一个类型,我希望将这种类型保留在数据库中的模型上,但我想留出错误的空间,因此我考虑将其硬编码到模型中。
这几乎是一个“这是 django 支持的东西吗?”的问题。我还没有完全测试过这一点,我不知道/不能说,如果我现在这样做,一切都会好起来的……但我似乎找不到相关的文档,并且想学习最佳实践。
以下是我的意思的示例:
from django.db import models
from enum import Enum
class PersonType(Enum):
STUDENT = "Student"
TEACHER = "Teacher"
class BaseClass(models.Model):
"""Represents a base model"""
name = models.TextField()
age = models.IntegerField()
class Student(BaseClass):
"""Represents a student"""
type = PersonType.STUDENT.value
class Teacher(BaseClass):
"""Represents a teacher"""
type = PersonType.TEACHER.value
django 会接受这样的东西吗?我能想到的唯一其他解决方案是使用 default
属性设置输入 TextField
,并且永远不要通过序列化程序公开它。我没有理由不能这样做,只是检查它是否也可以工作,因为它在美学上更令人愉悦。
最佳答案
首先,您的基类应该是抽象的,因为在数据库中拥有该表是没有意义的。
对于枚举问题,您应该将 CharField 与选项一起使用。 这是一个供您引用的示例。
from django.db import models
PERSON_TYPE = (
('Student', 'Student'),
('Teacher', 'Teacher'),
)
class BaseClass(models.Model):
"""Represents a base model"""
name = models.TextField()
age = models.IntegerField()
type = models.CharField(choices=PERSON_TYPE)
class Meta:
abstract = True
class Student(BaseClass):
"""Represents a student"""
def __init__(self, *args, **kwargs):
kwargs['type'] = kwargs.get('type') or 'Student'
super().__init__(*args, **kwargs)
class Teacher(BaseClass):
"""Represents a teacher"""
def __init__(self, *args, **kwargs):
kwargs['type'] = kwargs.get('type') or 'Teacher'
super().__init__(*args, **kwargs)
看起来使用继承没有意义,因为 Student 和 Teacher 模型都具有相同的字段。不过,您可能需要为每个模型添加特定字段,这对于您从一开始就进行分离会派上用场。
关于python - Django 模型可以有硬编码的无类型字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68113179/