将未知对象类型保存到django中的数据库中

xhv8bpkk  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(388)

我有以下型号:

class Parameter(models.Model):
    par_type = = models.CharField(max_length=30)
    value = models.TextField()

大多数时候 value 字段将存储一个数字( value=3.2118 ). 但是有时我想分配一个其他对象ID的列表(比如 value="[32, 22, 45]" )或字符串对象(如 value="pass" )等等,我会用 value 基于 par_type :

def foo(par): # par is a Parameter object.
    return float(par.value) / 2

def bar(par):
    # Some code to convert a par to a list of objects
    object_list = get_objects(par) 
    # Return a random object from list
    return random.choice(object_list)

我不想为每种可能的对象类型编写一段代码。理想的情况是有一个 decompose() 函数可以在任何地方使用。我想把对象保存为 pickle 或者 JSON 类型(从这里看到的)。但我不知道怎么做。我正在使用mysql数据库。

omtl5h9j

omtl5h9j1#

您可以使用binaryfield进行如下尝试:

import pickle

class Parameter(models.Model):
    _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)

用法:

In: b = Foo.objects.create(value=1)

In: b.value
Out: 1

In: b = Foo.objects.create(value={1:1,2:2})

In: b.value
Out: {1: 1, 2: 2}

In: b = Foo.objects.create(value=[1,1])

In: b.value
Out: [1, 1]

仅供参考,你不能储存 pass 因为它不是python对象,而是语法的一部分。考虑使用 None .

相关问题