Как распаковать значение enum, используемое в Flask Sqlaclhemy? - PullRequest
1 голос
/ 28 января 2020

Я определил enum.

from enum import Enum
class Status(Enum):
    pending = 'PENDING'
    processed = 'PROCESSED'
    delivered = 'DELIVERED'

В model.py

class Activity(db.Model):

    __tablename__ = 'activity'
    id = db.Column(db.Integer, primary_key=True))
    message = db.Column(db.String, nullable=False)
    status = db.Column(db.Enum(Status), nullable=False)

в controller.py

jsn_data = request.get_json()
activity_obj = Activity(message=jsn_data['message'], status=jsn_data['status'])

в запросе json body

{
   "message": 'Hi',
   "status':'pending'
}

Так что здесь я хочу, чтобы значение состояния «PENDING» сохранялось в БД, а не «в ожидании». Дайте мне знать, что мне не хватает.

1 Ответ

0 голосов
/ 28 января 2020

Документация содержит пример:

import enum
class MyEnum(enum.Enum):
    one = 1
    two = 2
    three = 3

t = Table(
    'data', MetaData(),
    Column('value', Enum(MyEnum))
)

Выше указаны имена строк каждого элемента, например, «один», «два», «три». », Сохраняются в базе данных; значения перечисления Python, обозначенные здесь как целые числа, не используются; поэтому значение каждого перечисления может быть любым типом объекта Python независимо от того, является ли он постоянным.

Чтобы сохранить значения, а не имена, можно использовать параметр Enum.values_callable. Для простого перечисления, в котором используются строковые значения, достаточно вызвать, например,

lambda x: [e.value for e in x].

Таким образом, чтобы использовать значения вместо ключей, укажите values_callable:

t = Table(
    'data', MetaData(),
    Column('value', Enum(MyEnum, 
     values_callable=lambda x: [str(e.value) for e in MyEnum])
    )
   )
)

Я бы предложил использовать echo=True с create_engine, чтобы увидеть, что SQL было сгенерировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...