0

J'ai un modèle avec un JSONField.Valider un champ spécifique dans le sérialiseur DRF

model.py

class Categories(models.Model): 
    type = models.CharField(max_length=20) 
    name = models.CharField(max_length=500) 
    details = JSONField(blank=True, null=True) 

Actuellement, je suis en utilisant serializers.ModelSerializer pour sérialisation ce modèle ci-dessus:

serializers.py

class CategoriesSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Categories 
     fields = ('id', 'type', 'name', 'details') 

En raison de cela, le champ des détails est vérifiée uniquement pour contenir valid json. Ce que je dois vraiment faire est d'effectuer une validation personnalisée basée sur le Json Schema défini pour le champ de détails. Cependant, comme je ne veux pas d'autres validations personnalisées pour le reste des champs, je voudrais continuer à utiliser les validations fournies par serializers.ModelSerializer. Est-il possible de remplacer une validation pour un seul champ, probablement en écrivant un sérialiseur personnalisé pour seulement le champ de détails?

question Note n'est pas sur la façon d'écrire un validateur personnalisé, mais sur la façon d'utiliser cette validateur personnalisé sur un champ dans le sérialiseur héritant ModelSerializer

Répondre

2

serializers de DRF offrent l'option de validation field level. Vous pouvez effectuer des détails validation sur le terrain en mettant en œuvre la méthode validate_details:

class CategoriesSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Categories 
     fields = ('id', 'type', 'name', 'details') 

    def validate_details(self, value): 
     if value['not_valid']: 
      raise serializers.ValidationError("Not valid") 
     return value 
+0

puis-je utiliser ma classe Validator personnalisée au lieu de la fonction? Ou peut-être dans la fonction 'validate_details'? J'ai besoin d'utiliser une classe car il y a plusieurs schémas pour le champ 'details', donc je voudrais profiter de l'héritage des validateurs ici. –

+0

@IshanKhare vous pouvez essayer de passer le validateur basé sur la classe http://www.django-rest-framework.org/api-guide/validators/#class-based avec l'argument de validation des champs http: //www.django-rest-framework .org/api-guide/fields/# validateurs – neverwalkaloner

+0

quelque chose comme 'validators = [MyDetailsValidator ('details')]'? –