Django: 存储浮点数列表的模型字段?
我想在Django中存储一个可变长度的浮点数列表。虽然有一个叫做CommaSeparatedIntegerField的字段,但有没有类似的可以用来存储浮点数的呢?我是不是应该自己实现一个CommaSeparatedFloatField,还是说其实还有其他我没想到的解决办法?谢谢。
2 个回答
0
这要看你具体的使用情况。如果你得到的浮点数列表是以字符串的形式存在,并且你不需要直接使用这些数值,那么把它当作字符字段来处理是可以的。不过,这样做并不是特别节省空间,而且如果你想对这些数字做其他操作,比如计算,就得先进行转换。
如果你有很长的浮点数列表,常常需要查找、使用或者修改这些数值,并且想要节省数据库的空间,那么你可以考虑使用PickledObjectField,或者把浮点数写成二进制字符串(就像写入二进制文件一样),然后用BinaryField来存储这个二进制字符串。
虽然PickledObjectField可能有点过于复杂,但如果你将来可能会改变这个对象的结构,或者需要存放一些不是浮点数的东西,那它可能是个不错的选择。
BinaryField则是以最接近原始形式的方式来存储数字。这意味着它应该占用最少的存储空间,查找和转换速度最快,而且在四舍五入或转换时出错的可能性最小。struct这个库提供了一些函数,可以用来在二进制字符串和其他格式之间进行转换。
7
我觉得你可以很简单地定义自己的字段:
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)
这个代码片段没有经过测试,但你可以根据自己的需要进行调整。