validate update multiple framework fields def create charfield allow python django validation django-rest-framework

python - update - django rest framework serializer datetime format



Django resto marco y validaciĆ³n de modelo (1)

Comenzando a usar django-rest-framework, y estoy teniendo algunos problemas con la validación.

Tengo un modelo básico, y he aplicado validadores a una parte de sus campos (un MaxLengthValidator regular y un RegexValidator personalizado, terminando con algo como esto:

class ZipCodeValidator(RegexValidator): regex = ''^([0-9]{5})$'' message = u''Invalid ZipCode.'' class User(AbstractUser, BaseUser): """ Custom user model """ # ... other fields ... zipcode = models.CharField( max_length=5, blank=True, validators=[ZipCodeValidator()] ) description = models.TextField( null=True, blank=True, max_length=1000, validators=[MaxLengthValidator(1000)] )

Luego creé un ModelSerializer asignado a este modelo, con algunos campos y métodos adicionales. Todo esto es servido por un `RetrieveUpdateAPIView muy simple.

Me doy cuenta de que no se llama a los validadores (puedo ingresar cualquier cosa en el campo del código postal o superar los 1000 caracteres para la descripción).

La solución rápida y sucia ha sido anular los dos campos en el nivel de serializador y asignarles el validador allí:

class UserSerializer(serializers.ModelSerializer): zipcode = serializers.WritableField( source=''zipcode'', required=False, validators=[ZipCodeValidator()] ) description = serializers.WritableField( source=''description'', required=False, validators=[MaxLengthValidator(1000)] )

Esto funciona bien, pero no me gusta mucho. Prefiero que esta validación se realice en el nivel del modelo para que sea más segura (no me gustaría tener una validación adicional o personalizada en el serializador, pero esas reglas deberán aplicarse en todos los casos). Dado que los serializadores funcionan de forma muy parecida a los formularios django, esperaba que llamaran al método clean & cie del modelo antes de guardarlos, pero un vistazo rápido a la source parece indicar que no lo hace.

Esto es un poco molesto, me obliga a duplicar gran parte del código de los campos si quiero asegurarme de que la validación siempre suceda, y prefiero mantener esto tan SECO como sea posible.

Puede que me esté faltando algo, pero ¿existe una forma agradable y clara de garantizar que el serializador ejecute esos validadores antes de actualizar el modelo?

EDITAR: El doble comprobó la fuente, resulta que la vista full_clean método full_clean la instancia antes de guardarla en la base de datos, que a su vez termina ejecutando el validador del modelo. Todavía perdidos en cuanto a por qué esos no parecen correr, aunque.


Esto funciona para mí:

class ZipCodeValidator(RegexValidator): regex = r''^[0-9]{5}$'' message = ''Invalid ZipCode.'' class MyModel(models.Model): zipcode = models.CharField(max_length=5, blank=True, validators=[ZipCodeValidator()]) class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel >>> s1 = MyModelSerializer(data={''zipcode'': ''34234''}) >>> s1.is_valid() True >>> s2 = MyModelSerializer(data={''zipcode'': ''f3434''}) >>> s2.is_valid() False >>> s2.errors {''zipcode'': [u''Invalid ZipCode.'']}