4
votes

Mandate le type entier dans le validateur django-rest-framework pour integerfield

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?


0 commentaires

3 Réponses :


0
votes

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)


2 commentaires

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



0
votes

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')


5 commentaires

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.



4
votes

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


0 commentaires