【问题标题】:Python Flask RestPlus Enum TypePython Flask RestPlus 枚举类型
【发布时间】:2018-01-20 12:03:54
【问题描述】:

我正在使用python 3.4. 我创建了一个enum 类型,如下所示:

import enum
class EnumGender(enum.Enum):
    blank = ' '
    female = 'Female'
    male = 'Male'
    other = 'Other'

我的问题是如何将它分配给 flask-restplus 字段,因为我能看到的唯一示例是:

fields.String(description='The object type', enum=['A', 'B'])

【问题讨论】:

标签: python flask enums flask-restplus


【解决方案1】:

您可以为其分配成员名称:

fields.String(description='The object type', enum=EnumGender._member_names_)

【讨论】:

  • 是否可以将 enum.IntEnum 与 fields.Integer 一起使用?
  • Docs 告诉我没有Enum._member_names_ 但有Enum.__members__ 这是一个视图。所以你必须做fields.String(description='The object type', enum=EnumGender.__members__.items())。有点冗长。
  • 对我来说 _members__items() 抛出不可序列化的错误,虽然 _member_names 受到保护,但它可以工作。
【解决方案2】:

我选择了这种方法:

fields.String(attribute=lambda x: str(EnumGender(x.FieldContainingEnum).name))

(来源:How to get back name of the enum element in python?

【讨论】:

    【解决方案3】:

    在我的例子中,枚举是这样的:

    from enum import Enum
    
    
    class SubscriptionEvent(Enum):
        on_success = "ON_SUCCESS"
        on_error = "ON_ERROR"
    

    我需要这样的元帅定义:

    subscription_action_serializer = api.model('SubscriptionAction', {
        'event': fields.String(enum=[x.value for x in SubscriptionEvent], attribute='event.value'),
    })
    

    我只需要接受并呈现为有效的枚举值"ON_SUCCESS", "ON_SUCCESS"

    【讨论】:

      【解决方案4】:

      另一种可能性,Python 3.7.3(大约 2019 年 11 月):

      fields.String(description="The object type",
                    enum=[x.name for x in EnumGender])
      

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 2018-10-18
        • 2017-01-14
        • 2020-04-05
        • 1970-01-01
        • 2017-01-04
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多