将未知对象类型保存到 Django 中的数据库中
Saving an unknown object type into database in Django
我有以下型号:
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 db.
你可以这样尝试 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
而不是 pass。
我有以下型号:
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 db.
你可以这样尝试 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
而不是 pass。