Le validateur django-rest-framework accepte les entiers entre guillemets de chaîne comme données valides pour le champ entier. Existe-t-il un moyen de rendre obligatoire le type de données afin que les entiers entre guillemets ne soient pas acceptés?
3 Réponses :
Vous pouvez ajouter un validateur personnalisé au champ.
Validateur personnalisé
Vous pouvez créer un champ de sérialiseur personnalisé qui génère des erreurs avant la conversion en entier.
class TrueIntegerField(serializers.IntegerField): def to_internal_value(self, data): if isinstance(data, six.text_type): raise serializers.ValidationError("Value should be an integer") return super().to_internal_value(data)
drf convertit l'argument passé au validateur personnalisé et sera un entier pour le champ entier. cela ne fonctionnera pas dans ce cas.
Oh, tu as raison. Votre meilleur pari est d'étendre IntegerField
Vous pouvez écrire la validation de champ
def validate_field_name(self): validating_data = self.context.get('request').data.get('field_name') if isinstance(validating_data, int): return validating_data raise ValidationError('Integer value required')
drf convertit l'argument passé au validateur personnalisé et sera un entier pour le champ entier. qui ne fonctionnera pas dans ce cas
DRF convertit les données mais nous prenons les données de la requête qui est dans la forme réelle.
Ceci est applicable à un cas particulier. Il n'est pas nécessaire qu'il y ait toujours un contexte.
Sans contexte comment nous transmettons les données? S'il y a une demande, il y aura un contexte.
essayez le code dans la réponse ci-dessus. il n'y a pas de contexte là-bas.
Le sérialiseur conserve les données brutes dans self.initial_data
d'où les méthodes de validation personnalisées peuvent les récupérer. Donc, ce qui suit fonctionne
class Test(Serializer): true_int = IntegerField() def validate_true_int(self, value): value = self.initial_data.get('true_int') if isinstance(value, int): return value raise ValidationError("Not an int") data = {'true_int': '10'} t = Test(data=data) t.is_valid() # false data = {'true_int': 10} t = Test(data=data) t.is_valid() # true