django-rest-framework cómo hacer campos de serializador de modelo requeridos

Tengo un modelo que estoy completando paso a paso, significa que estoy haciendo un asistente de formulario.

Debido a que la mayoría de los campos en este modelo son obligatorios pero tienen null=True, blank=True para evitar generar errores no nulos al enviar parte de los datos.

Estoy trabajando con Angular.js y django-rest-framework y lo que necesito es decirle a la API que los campos x e y deben ser necesarios y debe devolver un error de validación si están vacíos.

Debe anular el campo específicamente y agregar su propio validador. Puede leer aquí para obtener más detalles en http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly . Este es el código de ejemplo.

 def required(value): if value is None: raise serializers.ValidationError('This field is required') class GameRecord(serializers.ModelSerializer): score = IntegerField(validators=[required]) class Meta: model = Game 

La mejor opción de acuerdo con la documentación aquí es usar extra_kwargs en la clase Meta, por ejemplo, tiene un modelo de perfil de usuario que almacena el número de teléfono y es necesario

 class UserProfileSerializer(serializers.ModelSerializer): class Meta: model = UserProfile fields = ('phone_number',) extra_kwargs = {'phone_number': {'required': True}} 

Este es mi camino para múltiples campos. Se basa en la reescritura de UniqueTogetherValidator.

 from django.utils.translation import ugettext_lazy as _ from rest_framework.exceptions import ValidationError from rest_framework.utils.representation import smart_repr from rest_framework.compat import unicode_to_repr class RequiredValidator(object): missing_message = _('This field is required') def __init__(self, fields): self.fields = fields def enforce_required_fields(self, attrs): missing = dict([ (field_name, self.missing_message) for field_name in self.fields if field_name not in attrs ]) if missing: raise ValidationError(missing) def __call__(self, attrs): self.enforce_required_fields(attrs) def __repr__(self): return unicode_to_repr('<%s(fields=%s)>' % ( self.__class__.__name__, smart_repr(self.fields) )) 

Uso:

 class MyUserRegistrationSerializer(serializers.ModelSerializer): class Meta: model = User fields = ( 'email', 'first_name', 'password' ) validators = [ RequiredValidator( fields=('email', 'first_name', 'password') ) ] 

Otra opción es usar required y trim_whitespace si estás usando un CharField:

 class CustomObjectSerializer(serializers.Serializer): name = serializers.CharField(required=True, trim_whitespace=True) 

documento required : http://www.django-rest-framework.org/api-guide/fields/#required trim_whitespace doc: http://www.django-rest-framework.org/api-guide/fields/#charfield