python marshmallow获取fields.Int()或fields.Str()

python marshmallow获取fields.Int()或fields.Str(),python,string,int,marshmallow,Python,String,Int,Marshmallow,我从另一个源接收数据,有时发送int,有时发送给定变量location的字符串。 例如,他们将1、2或3表示整数,或者他们将发送“building”或“car”或“bus”作为示例 我试过了 location = fields.Int(allow_string=True, strict=False) 这会产生以下错误 marshmallow.exceptions.ValidationError:{'status':['不是有效的 整数']} 及 这会产生以下错误 marshmallow.exc

我从另一个源接收数据,有时发送int,有时发送给定变量location的字符串。 例如,他们将1、2或3表示整数,或者他们将发送“building”或“car”或“bus”作为示例

我试过了

location = fields.Int(allow_string=True, strict=False)
这会产生以下错误

marshmallow.exceptions.ValidationError:{'status':['不是有效的 整数']}

这会产生以下错误

marshmallow.exceptions.ValidationError:{'status':['不是有效的 字符串']}

但它们并不适用于这两种类型。有没有一种方法可以同时接受两种类型:字符串和整数?

字段。Number
(其中
字段。Integer
字段。Float
字段。Decimal
继承)将愉快地接受有效的“可强制转换”字符串

这意味着您可以选择向它们传递一个整数或字符串,而不会出现问题。然而,如果铸造失败,你将面临一个例外

class MySchema(Schema):
     foo = fields.Integer()

MySchema().load({"foo": "123"})
# prints {"foo": 123}

MySchema().load({"foo": 456})
# prints {"foo": 456}

MySchema().load({"foo": "bar"})
# marshmallow.exceptions.ValidationError: {'foo': ['Not a valid integer.']}
相反,
fields.String
将不接受任何整数

class MySchema(Schema):
     foo = fields.Integer()

MySchema().load({"foo": "bar"})
# prints {"foo": "bar}

MySchema().load({"foo": 123})
# marshmallow.exceptions.ValidationError: {'foo': ['Not a valid string.']}
如果输入是整数或包含整数的字符串,则可以使用
字段.integer
解析它们


如果这是更随机的,您需要使用@shihe zhang所提到的,并自定义
\u反序列化
\u序列化
来处理您的数据。

问题不清楚。您需要处理任何字符串,还是只处理表示整数的字符串,例如“123”?您希望验证的数据实际上是字符串还是整数?@wim我在问题中提供了更多信息。它基本上是一个实际的数字:1或2或3,或者一个字符串:“汽车”、“公共汽车”或“建筑”。所以我需要能够同时接收这两个数据,然后不要使用模式验证。它的全部要点是严格,而不是空灵的精灵,似乎棉花糖是你想要的相反。也许你可以尝试自定义字段。
class MySchema(Schema):
     foo = fields.Integer()

MySchema().load({"foo": "bar"})
# prints {"foo": "bar}

MySchema().load({"foo": 123})
# marshmallow.exceptions.ValidationError: {'foo': ['Not a valid string.']}