【问题标题】:django smart decimal fielddjango 智能十进制字段
【发布时间】:2011-10-25 14:25:03
【问题描述】:

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

【问题讨论】:

  • 它实际上不会将它作为 int 类型存储在 DecimalField 中。您可能需要考虑编写模板标签或模型方法来输出打印的整数无十进制数
  • 我需要将接收到的值存储起来,这样我就可以从数据库中导入它,而不必担心 .0
  • 也许只是使用一个严格的清洁方法的 CharField
  • 这可能已经在这里回答了:stackoverflow.com/questions/4119151/…

标签: python django django-models


【解决方案1】:

对于鞋码字段的 TBH,我可能会使用带有选择属性的 CharField - 有效鞋码的数量相对较少,这样您就可以按照自己的意愿格式化它们。

如果它是 Product 模型的一部分,其中可能包含鞋子以外的东西,则“size”的 CharField 很有用,因为您还可以存储“M”、“L”、“XXL”等值。

您无需对鞋码进行任何数学计算,因此使用 DecimalField 毫无意义。

因此,数据库中保存的内容并不重要,只有您显示的内容和@j_syk 在 cmets 中提供了一些不错的替代建议。

【讨论】:

  • “M”、“L”等的好点。甚至有些鞋子也是这种尺寸,比如一些拖鞋和凉鞋。猜猜这取决于存储的数据是关于鞋子还是关于人的鞋码(即我永远不会说我的鞋码是 XL)。
  • 我已选择使用带有选项的字符域,我认为这是目前最简单的方法:)
【解决方案2】:

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

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

【讨论】:

  • 我从来没有想过这个,你认为最好的方法是什么,这意味着我必须编写一个自定义字段才能添加这个功能吗?
  • 您也许可以使用CharField 和initial value 来按您的意愿呈现它(只需将其转换为字符串)。保存时,Decimal 类将为您保存它,所以不用担心:它会工作得很好。
  • 但是十进制类保存的时候会用.o保存?
  • 它会将其转换为数字,所以是的,它会保存所有有效数字。
【解决方案3】:

我采用了这个解决方案:

  1. 创建自定义Django model Field
  2. 返回一个自定义的 decimal.Decimal 实例,该实例实现了 __unicode__ 中的技巧,因为这只是表示问题

这里是sn-p:

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']) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2012-09-24
    相关资源
    最近更新 更多