我想在Django中存储一个可变长度的浮点列表。有CommaSeparatedIntegerField,但是我可以使用这样的东西吗?是否最好只实现我自己的CommaSeparetedFloatField,或者是否有我完全遗漏的东西?感谢。
答案 0 :(得分:5)
我认为你可以很容易地定义自己的领域:
comma_separated_float_list_re = re.compile('^([-+]?\d*\.?\d+[,\s]*)+$')
validate_comma_separated_float_list = RegexValidator(
comma_separated_float_list_re,
_(u'Enter only floats separated by commas.'), 'invalid')
class CommaSeparatedFloatField(CharField):
default_validators = [validators.validate_comma_separated_float_list]
description = _("Comma-separated floats")
def formfield(self, **kwargs):
defaults = {
'error_messages': {
'invalid': _(u'Enter only floats separated by commas.'),
}
}
defaults.update(kwargs)
return super(CommaSeparatedFloatField, self).formfield(**defaults)
这个片段不是测试,但也许你可以根据自己的需要进行调整。
答案 1 :(得分:0)
这取决于您的用例。如果您将浮点数列表作为字符串获取并且永远不需要值本身,则子类化CharField是合理的。但是,它不是特别节省空间,如果你想对显示它们以外的数字做任何事情,你必须进行转换。
如果您有很长的浮动列表,通常需要查找,使用或修改它们的值,并且正在尝试保存数据库空间,您可以考虑使用PickledObjectField或将浮点数写入二进制字符串(比如写入二进制文件),并使用BinaryField存储该二进制字符串。
PickledObjectField有点矫枉过正,但是如果您以后可能更改此对象的结构或放入非浮动的东西,那么可能就是这样。
BinaryField是以最接近原始/内在形式的形式存储数字的字体。这意味着它应该具有最紧凑的存储,最快的查找和转化,以及舍入或转换时出现的最少错误。 struct包提供了转换为二进制字符串和从二进制字符串转换的函数。