【问题标题】:How to unpack enum value used in Flask Sqlaclhemy?如何解压 Flask Sqlalchemy 中使用的枚举值?
【发布时间】:2020-01-28 10:53:35
【问题描述】:

我已经定义了枚举。

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 正文中

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

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

【问题讨论】:

    标签: python python-3.x flask enums flask-sqlalchemy


    【解决方案1】:

    documentation 有一个例子:

    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=Truecreate_engine 来查看生成了什么SQL。

    【讨论】:

    • 我已经浏览了文档但与我的案例无关,我可能不明白。我只是想知道如何将枚举值提供给 db 列。
    • @VivekKumar 我已经添加了有关该主题的更多信息。
    • 它对我有用。非常感谢 。在我的情况下,我改变了这样status = db.Column(db.Enum(Status,values_callable=lambda x: [str(e.value) for e in Status]), nullable=False)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2021-11-13
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多