TypeError: 'Transaction' object is not iterable in Flask on Python 3.6
TypeError: 'Transaction' object is not iterable in Flask on Python 3.6
我正在尝试使用序列化程序将我的 JSON 数据存储到数据库中。我创建了一个 API 并在邮递员中使用。喜欢:
POST 端点:API/transaction
和 JSON
格式的数据
在我将它加载到序列化程序的地方 returns 出现错误。我也在 shell 中测试过。我在调试工具中没有得到确切的错误。
我的序列化程序是:
class TransactionSerializer(ma.ModelSchema):
"""transaction validation"""
partner_client_id = fields.String(required=True)
agent_id = fields.String(required=True)
agent_msisdn = fields.String(required=True)
code = fields.Integer(required=True)
title = fields.String(required=False)
price = fields.String(required=True)
currency = fields.String(required=False)
user_msisdn = fields.String(required=True)
requested_ip = fields.String(required=False)
platform = fields.String(required=False)
is_recurring = fields.Boolean(required=False)
class Meta:
"""Meta class."""
model = Transaction
这里是pythonSHELL
>>> from app.serializer.transaction_serializer import TransactionSerializer
>>> transaction_serializer = TransactionSerializer()
>>> trn_json ={
... "partner_client_id": "CLIENTID009",
... "agent_id": "agent222",
... "agent_msisdn": "8801831803255",
... "code": "10",
... "title": "10 Days Unlimited ",
... "price": "10.00",
... "currency": "BDT",
... "user_msisdn": "8801925533362",
... "requested_ip": "127.0.0.1",
... "platform": "universal",
... "is_recurring": True
... }
>>> trn_json
{'partner_client_id': 'CLIENTID009', 'agent_id': 'agent222', 'agent_msisdn': '8801831803255', 'code': '10', 'title': '10 Days Unlimited ', 'price': '10.00', 'currency': 'BDT', 'user_msisdn': '8801925533362', 'requested_ip': '127.0.0.1', 'platform': 'universal', 'is_recurring': True}
>>> transaction, errors = transaction_serializer.load(trn_json)
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: 'Transaction' object is not iterable
您正在尝试将加载结果解压缩为(结果,错误)元组。这就是您对 marshmallow 2 所做的。
使用 marshmallow 3,加载和转储要么输出结果(无错误),要么引发异常。当模式具有 strict=True
元选项时,这相当于 marshmallow 2。参见 Upgrading to 3.0 - Schemas are always strict。
我猜你用的是 marshmallow 3(很棒)但是 marshmallow 2 方式。
请尝试
try:
transaction = transaction_serializer.load(trn_json)
except ma.ValidationError as err:
errors = err.messages
valid_data = err.valid_data
如果您从某些文档中复制了元组解包代码,您可能需要联系作者以获取更新。
是的,@Jerome 很棒的解决方案。适合我。
我遇到类型错误:'ValidationError' 对象不是映射
我必须做的:
except ValidationError as e:
raise CustomException(message=e.messages, status_code=400)
如果没有错误 (e) 的消息属性,marshmallow 会将结果作为消息列表和状态代码的元组抛出。
我正在尝试使用序列化程序将我的 JSON 数据存储到数据库中。我创建了一个 API 并在邮递员中使用。喜欢:
POST 端点:API/transaction
和 JSON
格式的数据
在我将它加载到序列化程序的地方 returns 出现错误。我也在 shell 中测试过。我在调试工具中没有得到确切的错误。
我的序列化程序是:
class TransactionSerializer(ma.ModelSchema):
"""transaction validation"""
partner_client_id = fields.String(required=True)
agent_id = fields.String(required=True)
agent_msisdn = fields.String(required=True)
code = fields.Integer(required=True)
title = fields.String(required=False)
price = fields.String(required=True)
currency = fields.String(required=False)
user_msisdn = fields.String(required=True)
requested_ip = fields.String(required=False)
platform = fields.String(required=False)
is_recurring = fields.Boolean(required=False)
class Meta:
"""Meta class."""
model = Transaction
这里是pythonSHELL
>>> from app.serializer.transaction_serializer import TransactionSerializer
>>> transaction_serializer = TransactionSerializer()
>>> trn_json ={
... "partner_client_id": "CLIENTID009",
... "agent_id": "agent222",
... "agent_msisdn": "8801831803255",
... "code": "10",
... "title": "10 Days Unlimited ",
... "price": "10.00",
... "currency": "BDT",
... "user_msisdn": "8801925533362",
... "requested_ip": "127.0.0.1",
... "platform": "universal",
... "is_recurring": True
... }
>>> trn_json
{'partner_client_id': 'CLIENTID009', 'agent_id': 'agent222', 'agent_msisdn': '8801831803255', 'code': '10', 'title': '10 Days Unlimited ', 'price': '10.00', 'currency': 'BDT', 'user_msisdn': '8801925533362', 'requested_ip': '127.0.0.1', 'platform': 'universal', 'is_recurring': True}
>>> transaction, errors = transaction_serializer.load(trn_json)
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: 'Transaction' object is not iterable
您正在尝试将加载结果解压缩为(结果,错误)元组。这就是您对 marshmallow 2 所做的。
使用 marshmallow 3,加载和转储要么输出结果(无错误),要么引发异常。当模式具有 strict=True
元选项时,这相当于 marshmallow 2。参见 Upgrading to 3.0 - Schemas are always strict。
我猜你用的是 marshmallow 3(很棒)但是 marshmallow 2 方式。
请尝试
try:
transaction = transaction_serializer.load(trn_json)
except ma.ValidationError as err:
errors = err.messages
valid_data = err.valid_data
如果您从某些文档中复制了元组解包代码,您可能需要联系作者以获取更新。
是的,@Jerome 很棒的解决方案。适合我。
我遇到类型错误:'ValidationError' 对象不是映射
我必须做的:
except ValidationError as e:
raise CustomException(message=e.messages, status_code=400)
如果没有错误 (e) 的消息属性,marshmallow 会将结果作为消息列表和状态代码的元组抛出。