Django创建自定义模型字段

2024-05-29 02:22:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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)

我正在跟踪Python 1.7 documentation for creating custom model fields

在上面的代码中,当我使用此字段保存模型时,永远不会调用get_db_prep_value方法。to_python方法工作正常(如果我在数据库中手动输入值,它将返回正确的十进制数),但是它永远不会保存正确的值。

我也试过使用get_prep_value,结果是一样的。

如何使它保存正确的值?


Tags: to方法self示例dbgetreturnvalue
1条回答
网友
1楼 · 发布于 2024-05-29 02:22:59

Integer based MoneyField

我使用这个Django片段已经有一段时间了,但是后来意识到在保存数据库之前,它在转换为整数时引入了浮点工件。

另外,从Django 1.9SubfieldBase has been deprecated开始,我们应该使用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)

相关问题 更多 >

    热门问题