1

我正在尝试使用序列化程序将我的 JSON 数据存储到数据库中。我创建了一个 API 并在邮递员中使用。像 :

POST 端点:API/transaction和带有JSON格式的数据

在我加载到序列化程序的地方,它返回一个错误。我也在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

这是蟒蛇壳

>>> 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
4

2 回答 2

1

您正在尝试将加载结果解压缩为 (result, error) 元组。这就是你对棉花糖 2 所做的。

使用 marshmallow 3,加载和转储要么输出结果(无错误),要么引发异常。strict=True 当模式具有元选项时,这相当于棉花糖 2 。请参阅升级到 3.0 - 模式总是严格的

我的猜测是您使用的是棉花糖 3(这很棒),但使用的是棉花糖 2 方式。

请试试

try:
    transaction = transaction_serializer.load(trn_json)
except ma.ValidationError as err:
    errors = err.messages
    valid_data = err.valid_data

如果您从某些文档中复制了元组解包代码,您可能需要 ping 作者以获取更新。

于 2020-01-31T14:40:10.890 回答
0

是的,@Jerome 很棒的解决方案。为我工作。

我收到 TypeError: 'ValidationError' object is not a mapping

我必须做:

except ValidationError as e:
    raise CustomException(message=e.messages, status_code=400)

如果没有错误 (e) 的消息属性,marshmallow 会将结果作为消息列表和状态代码的元组抛出。

于 2021-08-26T11:40:06.450 回答