Ошибка типа: объект «Транзакция» не может быть повторен в Flask в Python 3.6 - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь использовать сериализатор для хранения моих JSON данных в БД. Я создал API и использую в почтальоне. Например:

Конечная точка POST: API/transaction и данные в формате JSON

При загрузке в сериализатор возвращается ошибка. Я тоже в оболочке тестировал. Я не получаю точную ошибку в инструменте отладки.

мой сериализатор:

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

Здесь python SHELL

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

1 Ответ

1 голос
/ 31 января 2020

Вы пытаетесь распаковать результат загрузки как (результат, ошибка) кортеж. Это то, что вы сделали бы с зефиром 2.

С зефиром 3 загрузка и выгрузка либо выводят результат (без ошибок), либо выдают исключение. Это эквивалентно зефиру 2, когда схема имеет мета-опцию strict=True. См. Обновление до 3.0 - Схемы всегда строгие .

Я думаю, вы используете зефир 3 (что здорово), но зефир 2 пути.

Пожалуйста, попробуйте

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

Если вы скопировали код распаковки кортежа из какой-то документации, вы, возможно, захотите пропинговать автора сообщения об обновлении.

...