2 votes

Python marshmallow force field.int to only accept int and not strings

J'ai un champ entier de guimauve, mais c'est très étrange lorsque je passe les données comme {number:"123"} aussi, cela fonctionne, comme s'il s'agissait d'un entier, je suppose qu'en interne, il effectue la conversion en int, mais je ne veux pas ça. Je veux forcer l'utilisateur à utiliser INT tout le temps pour éviter toute confusion sur les types de données pouvant être acceptés. Y a-t-il un moyen ou un paramètre pour cela?

number = fields.Integer(obligatoire=True,
                        valider=Range(min=1, erreur="La valeur doit être supérieure à 0"))

Merci pour l'aide les gars.

4voto

PoP Points 301

En regardant le code, je pense que ce n'est pas possible, et je suis surpris par cela. Je sais qu'il y a un drapeau strict que vous pouvez définir, mais il n'opère que dans certains cas. Observez :

from marshmallow import *
from  marshmallow.validate import Range

class MySchema(Schema):
    number = fields.Integer(strict=True, required=True, validate=[Range(min=1, error="La valeur doit être supérieure à 0")])

Cela fonctionne dans ce cas :

s = MySchema()
s.dumps({'number': "123.1"})
>>> MarshalResult(data='{}', errors={'number': ['Pas un entier valide.']})

Mais pas dans ces cas

s.dumps({'number': 123.1})
>>> MarshalResult(data='{"number": 123}', errors={})

s.dumps({'number': "123"})
>>> MarshalResult(data='{"number": 123}', errors={})

Ce que je trouve incohérent. Peut-être que votre meilleur choix est d'écrire soit un champ personnalisé, soit un validateur différent qui valide l'entrée avant qu'elle ne soit transmise à votre schéma.

Mise à jour : Il semblerait que le problème soit résolu dans les versions récentes de Marshmallow

0voto

nbarraille Points 3051

Si vous lisez ceci maintenant, définir strict=True sur le champ fonctionnera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X