我有一个Parameter
模型来存储参数类型(大约20-30种可能的parameter_type
)及其相应的值。我要保存在此表中的示例值是:
╔═════════════════╦═══════════════════════╗
║ parameter_type ║ value ║
╠═════════════════╬═══════════════════════╣
║ "min" ║ 12 ║
╠═════════════════╬═══════════════════════╣
║ "initial_value" ║ -2 ║
╠═════════════════╬═══════════════════════╣
║ "prior_dist" ║ "normal" ║
╠═════════════════╬═══════════════════════╣
║ "prior_par" ║ {"mu": 0, "sd": 1} ║
╠═════════════════╬═══════════════════════╣
║ "start_values" ║ [-2, 0, 2] ║
╠═════════════════╬═══════════════════════╣
║ "initial_dist" ║ "uniform" ║
╠═════════════════╬═══════════════════════╣
║ "initial_par" ║ {"min": -3, "max": 3} ║
╚═════════════════╩═══════════════════════╝
要执行此操作,我遵循了HERE的建议并使用了pickle
。
import pickle
from django.db import models
class Parameter(models.Model):
model = models.ForeignKey(MyModelClass,
on_delete=models.CASCADE,
related_name='parameters')
parameter_type = models.CharField(max_length=30)
_value = models.BinaryField()
def set_data(self, data):
self._value = pickle.dumps(data)
def get_data(self):
return pickle.loads(self._value)
value = property(get_data, set_data)
class MyModelClass(models.Model):
method = models.CharField(max_length=30)
这使我可以按预期存储数据。但我不能使用django.admin
(可能是因为BinaryField
'...can’t be included in a ModelForm'之后)。现在,我只能使用Django的外壳程序添加值。有没有一种方法可以自定义管理员,以允许在此value
字段中输入数据?
我不想大幅度更改数据结构。但是,由于parameter_type
选项的数量有限,并且每个parameter_type
的值结构都相同,因此我可以为每个类型-值对编写自定义表单(我不知道如何这个)。另外,可以选择将BinaryField
更改为TextField
,如图HERE所示。