【发布时间】:2022-01-04 17:47:07
【问题描述】:
我想创建一个类似于以下示例的数据库模型:
这个想法是用户(或任何模型)可以具有多个具有不同值的不同特征(或其他)。特征可以是任何东西,例如整数(薪水)、日期(生日)或多项选择(C、Python 等能力)。为了保持数据库设计简单,我尝试了一种方法,我只有一个 Feature 表,它通过 Choice 表具有可选选项,而不是为每种特征类型设置单独的数据库表。用户对特征值的选择存储到 User_has_Feature 表的“值”字段中,该字段是一个 CharField,可以存储多种不同的数据类型,如整数、日期、选择、多项选择等。
我的问题是,我如何验证所有数据,以便针对字段数据类型进行验证,并在管理或 UI 中正确显示所有内容(针对不同类型有不同的 UI 小部件)?
我尝试了一种方法,将每个特征的字段类型存储到字段表中,可以是 CharField、IntegerField、DateField 等。然后在 User_has_Feature 模型 clean() 中,我可以动态验证字段类型,例如示例:
FIELDS = {
'DateField': DateField,
'IntegerField': IntegerField,
etc.
}
def clean(self):
class_ = FIELDS.get(self.feature.field)
if class_ in [DateField, IntegerField, ...]:
field = class_()
field.clean(self.value)
elif class_ in [ModelChoiceField, ModelMultipleChoiceField]:
etc.
这种方法适用于验证,但它对管理小部件没有帮助,而且数据总是作为字符串处理,而不是整数、日期、列表等。所以我开始研究创建一个选项自定义 ValueField 模型字段,它继承 CharField,并将所有数据作为字符串存储到数据库中,但会为值动态更改小部件和数据类型 (to_python)。到目前为止没有成功,我尝试的一切似乎都过于复杂。
对我来说,这似乎是很常见的需求,因此我希望已经存在一些“简单”的解决方案。或者,我需要完全尝试不同的数据库设计方法。
【问题讨论】:
标签: django django-models django-admin