Lon*_*Dev 4 python django django-models django-forms django-1.7
我试图在Django中创建一个自定义字段,它将采用十进制货币值(例如:£1.56)并将其作为整数(例如:156)保存在数据库中以存储货币值.
这是我到目前为止(我已经把固定值测试)
class CurrencyField(models.DecimalField):
__metaclass__ = models.SubfieldBase
def get_internal_type(self):
return 'PositiveIntegerField'
def to_python(self, value):
print "CurrentField to_python"
return Decimal(value)/100
def get_db_prep_value(self, value, connection, prepared=False):
print "CurrentField get_db_prep_value"
if value is None:
return value
print type(value)
return int(value*100)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,get_db_prep_value当我使用此字段保存模型时,永远不会调用该方法.该to_python方法工作正常(如果我手动输入数据库中的值将返回正确的小数),但它永远不会保存正确的值.
我也尝试过使用get_prep_value,结果相同.
如何保存正确的值?
我一直在使用这个Django片段,但后来意识到在保存数据库之前转换为整数时会引入浮点伪像.
此外,从Django 1.9 开始,SubfieldBase 已被弃用,我们应该使用Field.from_db_value.所以我编辑了代码来解决这两个问题.
class CurrencyField(models.IntegerField):
description = "A field to save dollars as pennies (int) in db, but act like a float"
def get_db_prep_value(self, value, *args, **kwargs):
if value is None:
return None
return int(round(value * 100))
def to_python(self, value):
if value is None or isinstance(value, float):
return value
try:
return float(value) / 100
except (TypeError, ValueError):
raise ValidationError("This value must be an integer or a string represents an integer.")
def from_db_value(self, value, expression, connection, context):
return self.to_python(value)
def formfield(self, **kwargs):
from django.forms import FloatField
defaults = {'form_class': FloatField}
defaults.update(kwargs)
return super(CurrencyField, self).formfield(**defaults)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7912 次 |
| 最近记录: |