2015-06-20 8 views
7

Ho un modello che sto compilando passo dopo passo, significa che sto facendo un wizard di moduli.django-rest-framework come rendere necessari i campi del serializzatore del modello

A causa di ciò la maggior parte dei campi in questo modello sono obbligatori ma hanno null=True, blank=True per evitare di generare errori non nulli quando si invia parte dei dati.

Sto lavorando con Angular.js e django-rest-framework e ciò di cui ho bisogno è di dire all'API che i campi x e y dovrebbero essere richiesti e che deve restituire un errore di convalida se sono vuoti.

risposta

5

È necessario eseguire l'override del campo in modo specifico e aggiungere il proprio validatore. Puoi leggere qui per maggiori dettagli http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly. Questo è il codice di esempio.

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 
4

Questo è il mio modo per più campi. Si basa sulla riscrittura 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) 
     )) 

Usage:

class MyUserRegistrationSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ('email', 'first_name', 'password') 
     validators = [ 
      RequiredValidator(
       fields=('email', 'first_name', 'password') 
      ) 
     ] 
9

L'opzione migliore in base alla documentazione here è quello di utilizzare extra_kwargs in classe Meta, per esempio avete modello UserProfile che memorizza il numero di telefono ed è necessario

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