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 .