136 votos

Cómo limitar el valor máximo de un campo numérico de un modelo de Django?

Django tiene varios campos numéricos disponibles para su uso en los modelos, por ejemplo, DecimalField y PositiveIntegerField. Aunque el primero puede ser limitado el número de lugares decimales que se almacena y el número total de caracteres almacenados, ¿hay alguna manera de restringir a almacenar sólo los números dentro de un rango determinado, por ejemplo, 0.0-5.0 ?

En su defecto, ¿hay alguna manera de restringir una PositiveIntegerField a sólo almacenar, por ejemplo, los números hasta el 50?

Actualización: ahora que el Fallo 6845 se ha cerrado, este StackOverflow pregunta puede ser discutible. - sampablokuper

275voto

user1569050 Puntos 754

Usted puede utilizar Django incorporado en los validadores-

from django.db.models import IntegerField, Model
from django.core.validators import MaxValueValidator, MinValueValidator

class CoolModelBro(Model):
    limited_integer_field = IntegerField(
        default=1,
        validators=[
            MaxValueValidator(100),
            MinValueValidator(1)
        ]
     )

Edit: Aunque estos sólo funcionan cuando está usando el modelo en un ModelForm, no, si usted está utilizando el modelo de "en su propia", suspiro.

125voto

NathanD Puntos 2433

También podría crear un modelo personalizado de tipo de campo - ver http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields

En este caso, podría "heredan" de la incorporada en el IntegerField y anular su lógica de validación.

Cuanto más pienso en esto, me doy cuenta de lo útil que esto sería para muchas aplicaciones Django. Tal vez un IntegerRangeField tipo, podría ser presentado como un parche para los desarrolladores de Django considerar la adición del tronco.

Este es trabajo para mí:

from django.db import models

class IntegerRangeField(models.IntegerField):
    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        models.IntegerField.__init__(self, verbose_name, name, **kwargs)
    def formfield(self, **kwargs):
        defaults = {'min_value': self.min_value, 'max_value':self.max_value}
        defaults.update(kwargs)
        return super(IntegerRangeField, self).formfield(**defaults)

A continuación, en la clase del modelo, que podría utilizarlo como este (campo siendo el módulo donde se pone el código de arriba):

size = fields.IntegerRangeField(min_value=1, max_value=50)

O para un rango de negativos y positivos (como un oscilador rango):

size = fields.IntegerRangeField(min_value=-100, max_value=100)

Lo que sería genial es si podría ser llamado con el operador de rango como este:

size = fields.IntegerRangeField(range(1, 50))

Pero, que requerirían de mucho más código, desde ya que se puede especificar un 'salto' parámetro de rango(1, 50, 2) - es una idea Interesante, aunque...

69voto

congocongo Puntos 231
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

size = models.IntegerField(validators=[MinValueValidator(0),
                                       MaxValueValidator(5)])

50voto

chrishaum Puntos 342

Tuve este mismo problema; aquí fue mi solución:

SCORE_CHOICES = zip( range(1,n), range(1,n) )
score = models.IntegerField(choices=SCORE_CHOICES, blank=True)

10voto

tghw Puntos 14244

Hay dos maneras de hacer esto. Uno es el uso de la validación de formulario para nunca dejar cualquier número de más de 50 ser introducido por un usuario. La validación de formularios de google docs.

Si no hay ningún usuario que intervienen en el proceso, o no estás usando un formulario para introducir los datos, entonces usted tendrá que reemplazar el modelo de la save método para producir una excepción o limitar los datos que se van al campo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X