2

Je crée actuellement un api basé sur DRF.I ont un modèle qui ressemble à:Comment écrire un champ personnalisé Validation pour ModelSerializers dans Django Rest Framework (DRF) similaire à Form Validation dans Django?

class Task(models.Model): 
    name = models.CharField(max_length = 255) 
    completed = models.BooleanField(default = False) 
    description = models.TextField() 
    text = models.TextField(blank = False, default = "this is my text") 

    def __unicode__(self): 
     return self.name 

et le sérialiseur correspondant pour ce modèle est que:

class TaskSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Task 
     fields = ('name','description','completed','text') 

Maintenant, ma question est que je Je veux valider le champ 'nom' de mon modèle en prenant des données. Par exemple, je peut mettre fin à la vérification du prénom ou du nom de l'utilisateur par un code Python similaire à un formulaire Django:

def clean_name(self): 
    name = form.cleaned_data.get('name') 
    first,second = name.split(' ') 
    if second is None: 
     raise forms.ValidationError("Please enter full name") 

Je sais de ce qu'on appelle « validate_ (fieldname) » en classe Serializers.serializer. Mais je veux que ce soit utilisé dans Serializers.ModelSerializer à la place. (Juste similaire à la validation des formulaires personnalisés dans Django)

Répondre

7

Vous pouvez ajouter une méthode validate_name() à votre sérialiseur qui effectuera cette validation. Il doit renvoyer la valeur validée ou déclencher un ValidationError.

Pour vérifier si l'utilisateur a entré un nom complet ou non, nous utiliserons str.split() qui renverra tous les mots de la chaîne. Si le non. de mots dans la chaîne n'est pas supérieure à 1, que nous allons augmenter un ValidationError. Sinon, nous retournons le value.

class TaskSerializer(serializers.ModelSerializer): 

    def validate_name(self, value): 
     """ 
     Check that value is a valid name. 
     """ 
     if not len(value.split()) > 1: # check name has more than 1 word 
      raise serializers.ValidationError("Please enter full name") # raise ValidationError 
     return value 
+0

Y a-t-il quelque chose de similaire à clean_data dans les sérialiseurs? –

+0

Oui, il existe 'serializer.validated_data' qui est accessible après l'appel de' .is_valid() 'sur le sérialiseur. –

+0

Merci. Ça marche. –