django智能十进制字段

时间:2011-10-25 14:25:04

标签: python django django-models

我正在创建一个基本上存储鞋码的应用程序以及其他信息。我一直在使用Django Decimal字段来存储大小,但是十进制字段存储大小如10作为10.0,所以我的问题是,有没有办法制作或者如果已经存在一个字段,当提供int(10)它将值存储为int,并在提供小数时 (10.5)然后将其存储为十进制?

3 个答案:

答案 0 :(得分:3)

鞋子尺码领域的TBH我可能会使用带有选择属性的CharField - 只有相对较少数量的有效鞋子大小,这样你就可以按照自己的方式格式化它们。

如果它是可能包含鞋子之外的其他东西的产品型号的一部分,则'大小'的CharField非常有用,因为您还可以存储“M”,“L”,“XXL”等值。

您不需要对鞋码进行任何数学运算,因此使用DecimalField是没有意义的。

由于这个原因,数据库中保存的内容并不重要,只有你显示的内容和@j_syk在评论中沿着这些行提供了一些很好的替代建议。

答案 1 :(得分:2)

不是简单地将它转换为字符串为你工作吗?您可以按原样保存存储空间,但在显示数据时可以根据自己的喜好格式化数据。

>>> str(Decimal(10))
'10'
>>> str(Decimal(10.5))
'10.5'
>>> str(Decimal(10.0))
'10'

答案 2 :(得分:1)

我采用了这个解决方案:

  1. 创建自定义Django model Field
  2. 返回在decimal.Decimal中实现技巧的自定义__unicode__实例,因为这只是一个代表问题
  3. 以下是摘录:

    class PyPrettyDecimal(decimal.Decimal): 
    
        def __unicode__(self): 
            # TODO: to improve with decimal properties ?!? 
            mod = self - int(self) 
            if not mod: 
                rv = int(self) 
            else: 
                rv = self.quantize(mod.normalize()) 
            return unicode(rv) 
    
    class PrettyDecimalField(models.DecimalField): 
    
        __metaclass__ = models.SubfieldBase 
    
        def to_python(self, value): 
            if value is None: 
                return value 
            try: 
                return PyPrettyDecimal(value) 
            except decimal.InvalidOperation: 
                raise exceptions.ValidationError(self.error_messages['invalid'])