python - 如何在单个 Django 模型中存储任意类型的值?

标签 python django django-models

假设我有未知数量的问题。例如:

  • 天空是蓝色的吗[y/n]
  • 您在 [date] 出生的日期
  • 什么是圆周率[3.14]
  • 什么是大整数[100]

现在,这些问题中的每一个都提出了一个不同但非常特定类型的答案( bool 值、日期、 float 、整数)。原生的 django 可以愉快地在模型中处理这些。

class SkyModel(models.Model):
    question = models.CharField("Is the sky blue")
    answer = models.BooleanField(default=False)

class BirthModel(models.Model):
    question = models.CharField("What date were your born on")
    answer = models.DateTimeField(default=today)

class PiModel(models.Model)
    question = models.CharField("What is pi")
    answer = models.FloatField()

但这有一个明显的问题,即每个问题都有一个特定的模型——所以如果我们以后需要添加一个问题,我必须更改数据库。呸。所以现在我想开始思考 - 如何建立一个模型,让答案类型转换自动发生?

ANSWER_TYPES = (
    ('boolean', 'boolean'),
    ('date', 'date'),
    ('float', 'float'),
    ('int', 'int'),
    ('char', 'char'),
)

class Questions(models.model):
    question = models.CharField(()
    answer = models.CharField()
    answer_type = models.CharField(choices = ANSWER_TYPES)
    default = models.CharField()

因此理论上这会执行以下操作:

  • 当我建立自己的观点时,我会查看答案的类型并确保我 只输入那个值。
  • 但是当我想提取那个答案时,它会以 answer_type 指定的格式返回数据。示例 3.14 返回为 float 而不是 str。

如何执行这种自动转换?或者有人可以建议更好的方法吗?

非常感谢!!

最佳答案

实际上,我刚刚遇到了有关可扩展用户设置的此类问题。我的解决方案是将模型上的类型存储在 CharField 中,并使用 getter 巧妙地使用 __builtin__getattr 进行类型转换>。这是我的代码(根据您的需要进行调整):

VALUE_TYPE_CHOICES = (
    ("unicode", "Unicode String"),
    ("int", "Integer"),
    ("bool", "Boolean"),
)

class Setting(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True)
    type = models.CharField(max_length=50, choices=VALUE_TYPE_CHOICES)
    default_value = models.CharField(max_length=127)

def get_setting(user, setting_id):
    profile_setting = #get the user's specific setting value here, not relevant
    type = getattr(__builtin__, profile_setting.setting.type)
    if type is bool:
        return type(int(profile_setting.value))
    else:
        return type(profile_setting.value)

其中有一个陷阱:bool('0') 实际上返回 True,因此我选择在类型转换为 int 之前类型转换为 bool 。还有其他方法可以完成此操作,例如使用 ast 模块的 literal_eval 方法。不过,总体而言,该模式有效。

关于python - 如何在单个 Django 模型中存储任意类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2678770/

相关文章:

python - Linux 2.6下python安装HDF5和H5PY

python - 使用 ELEMNTREE 和 Beautifulsoup 解析 XML 时遇到内存问题

python - Django 模型对空白值进行验证

python - URL 参数破坏 Flask 模板

python - 在 Python 中获取最高的字符串版本号

python - Django 可插拔动态导航应用程序

django rest 框架在 View 中返回选定的字段

python - 使用 django 将 CSV 文件导入 postgres

django - 实例化 Django 模型会引发 TypeError : isinstance() arg 2 must be a class, 类型,或类和类型的元组

具有多个抽象基类的 Django 字段类