在Django管理员中编辑腌制的BinaryField

时间:2018-12-06 16:07:45

标签: python django django-models django-admin pickle

我有一个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所示。

0 个答案:

没有答案