python - 如何解压 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”。让我知道我缺少什么。
解决方案
该文档有一个示例:
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=True
withcreate_engine
查看生成的 SQL。
推荐阅读
- c# - C#,英文和阿拉伯字符串方向
- google-chrome-extension - 从 Chrome 扩展中收集错误并发送报告
- reactjs - 如何修复在退格上不更新的 React 搜索过滤器
- c# - 迭代具有任意数量彼此连接的节点的最快方法
- android - 无法弄清楚 Kotlin 中的数据绑定
- javascript - 检测 JSON 中的更改,如果检测到更改,则发送通知
- python - ForeignKey 的反向查找值(子到父)
- android - LinearGradient 在使用borderWidth时隐藏android中的边框颜色
- python - 如何在 Python 中的特定行将 txt 文件注入/插入到另一个 txt 文件中
- nginx - 您何时会收到没有主机名的 Web 请求?