Saltar al contenido

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

Nuestro grupo de trabajo ha estado horas buscando la respuesta a tus dudas, te dejamos la respuestas por eso esperamos que te sea de gran apoyo.

Solución:

Puede usar los validadores integrados de Django:

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)
        ]
     )

Editar: Cuando trabaje directamente con el modelo, asegúrese de llamar al método full_clean del modelo antes de guardar el modelo para activar los validadores. Esto no es necesario cuando se utiliza ModelForm ya que los formularios lo harán automáticamente.

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

En este caso, podría ‘heredar’ del IntegerField incorporado y anular su lógica de validación.

Cuanto más pienso en esto, me doy cuenta de lo útil que sería para muchas aplicaciones de Django. Quizás se podría enviar un tipo IntegerRangeField como un parche para que los desarrolladores de Django consideren agregarlo al tronco.

Esto 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)

Luego, en su clase de modelo, lo usaría así (el campo es el módulo donde coloca el código anterior):

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

O para un rango de negativo y positivo (como un rango de oscilador):

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

Lo que sería realmente genial es si pudiera llamarse con el operador de rango de esta manera:

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

Pero, eso requeriría mucho más código ya que puede especificar un parámetro ‘omitir’ – rango (1, 50, 2) – Aunque es una idea interesante …

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

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

Acuérdate de que tienes la capacidad de glosar tu experiencia .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *