Ограничить поле Django FloatField до 2 знаков после запятой

Я ищу способ ограничить FloatField в Django до 2 десятичных знаков кто-нибудь получил представление о том, как это можно сделать без использования десятичного поля.

пробовал decimal_places=2но это просто дало мне ошибку миграции в поле float, поэтому я думаю, что этот метод должен работать только в десятичных полях.

3 ответов


Если вы только обеспокоены тем, как ваш FloatField появляется в формах, вы можете использовать шаблон filter floatformat.

из документов Django:

Если используется с числовым целочисленным аргументом, floatformat округляет число до такого количества знаков после запятой.

например, если value = 34.23234, то в вашем шаблоне:

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

Если вы хотите, чтобы ваша модель всегда сохранялась только с двумя десятичными знаками, а не просто меняла представление модели в шаблоне, пользовательский метод сохранения в вашей модели будет отлично работать. Пример модели ниже показывает, как.

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)

теперь каждый раз, когда вы сохраняете свою модель, вы гарантируете, что поле будет заполнено только поплавком с двумя десятичными знаками. Это можно обобщить на округление до любого числа decimal места.


поскольку 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])