在Django中将未知对象类型保存到数据库中

时间:2018-11-24 03:20:41

标签: mysql json django pickle

我有以下模型:

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()函数可以在任何地方使用。我想到将对象保存为pickleJSON类型(从here看到)。但是我不知道该怎么做。我正在使用MySQL数据库。

1 个答案:

答案 0 :(得分:1)

您可以使用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而不是通过。