首页 > 解决方案 > 如何解压 Flask Sqlaclhemy 中使用的枚举值?

问题描述

我已经定义了枚举。

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

在模型.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)

在控制器.py

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

在请求 json 正文中

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

所以在这里我希望将状态值“PENDING”存储在 DB 中,而不是“pending”。让我知道我缺少什么。

标签: pythonpython-3.xflaskenumsflask-sqlalchemy

解决方案


文档有一个示例:

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

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

上面,每个元素的字符串名称,例如“一”、“二”、“三”,都被持久化到数据库中;Python Enum 的值(此处以整数表示)未使用;因此,每个枚举的值可以是任何类型的 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=Truewithcreate_engine查看生成的 SQL。


推荐阅读