python - Django 模型可以有硬编码的无类型字段吗?

标签 python django django-models

基本上,我的问题源于需要创建从主基类分支的多个模型。这些模型中的每一个都有一个类型,我希望将这种类型保留在数据库中的模型上,但我想留出错误的空间,因此我考虑将其硬编码到模型中。

这几乎是一个“这是 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/

相关文章:

python - 如何在 Django 模型上存储字典?

python - NLTK树中叶子的绝对位置

python - 索引错误 : list index out of range while using aws

python - 从 Django 登录表单中的电子邮件中删除区分大小写

python - 使用必需的ForeignKey引用在Django(1.8)应用程序之间移动模型

django - 如何将自定义函数应用于 Django 中多个查询中的特定字段

Python np.delete 问题

python - Pandas:每行中最大 3 列值的总和

javascript - Django 网站未正确检查链接

python - 如何检查 list_display 如果没有值,以在 django admin 中显示?