Django: 存储浮点数列表的模型字段?

6 投票
2 回答
3708 浏览
提问于 2025-04-16 02:15

我想在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)

这个代码片段没有经过测试,但你可以根据自己的需要进行调整。

撰写回答