Django:用于存储浮动列表的模型字段?

时间:2010-08-03 14:19:02

标签: python django django-models

我想在Django中存储一个可变长度的浮点列表。有CommaSeparatedIntegerField,但是我可以使用这样的东西吗?是否最好只实现我自己的CommaSeparetedFloatField,或者是否有我完全遗漏的东西?感谢。

2 个答案:

答案 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包提供了转换为二进制字符串和从二进制字符串转换的函数。