我正在创建一个基本上存储鞋码的应用程序以及其他信息。我一直在使用Django Decimal字段来存储大小,但是十进制字段存储大小如10作为10.0,所以我的问题是,有没有办法制作或者如果已经存在一个字段,当提供int(10)它将值存储为int,并在提供小数时 (10.5)然后将其存储为十进制?
答案 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)
我采用了这个解决方案:
decimal.Decimal
中实现技巧的自定义__unicode__
实例,因为这只是一个代表问题以下是摘录:
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'])