我有以下模型:
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
类型(从here看到)。但是我不知道该怎么做。我正在使用MySQL数据库。
答案 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
而不是通过。