web-dev-qa-db-ja.com

Django FloatFieldを小数点以下2桁に制限する

DjangoでFloatFieldを小数点以下2桁に制限する方法を探しています。DecimalFieldを使用せずにこれを行う方法の手掛かりを誰かが持っています。

私は試した decimal_places=2but floatフィールド内での移行エラーが発生しただけなので、このメソッドはDecimalFields内でのみ機能する必要があると思います。

13
Aidan Doherty

FloatFieldがフォームにどのように表示されるかだけに関心がある場合は、テンプレートフィルター floatformat を使用できます。

Djangoドキュメントから:

数値整数引数とともに使用した場合、floatformatは数値をその小数点以下の桁数に丸めます。

たとえば、値= 34.23234の場合、テンプレートでは次のようになります。

{{ value|floatformat:2 }}  # outputs 34.23
39
pcoronel

テンプレート内のモデルの表示を変更するだけでなく、モデルが常に小数点以下2桁のみで保存されるようにしたい場合は、モデルのカスタム保存メソッドが適切に機能します。以下のサンプルモデルは、その方法を示しています。

class MyDataModel(models.Model):
    my_float = models.FloatField()

    def save(self, *args, **kwargs):
        self.my_float = round(self.my_float, 2)
        super(MyDataModel, self).save(*args, **kwargs)

これで、モデルを保存するたびに、フィールドに小数点以下2桁の浮動小数点のみが入力されることが保証されます。これは一般化して、小数点以下の桁数を四捨五入することができます。

6
Colton Hicks

Django 1.8+なので、FloatFieldまたは任意のModelFieldsにカスタムバリデーターを使用できます:

def validate_decimals(value):
    try:
        return round(float(value), 2)
    except:
        raise ValidationError(
            _('%(value)s is not an integer or a float  number'),
            params={'value': value},
        )

...そしてあなたのモデルでは次のように適用できます:

from Django.db import models

class MyModel(models.Model):
    even_field = models.FloatField(validators=[validate_decimals])
0
Catalin