最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Flask-restful中想要使用marshal格式化enum变量

Flask crifan 4189浏览 0评论

对于:

task_fields = {
    ‘id’: fields.String,
    ‘promotionCode’ : fields.String,
    ‘hasFinished’ : fields.Boolean,
    ‘initiatorId’ : fields.String,
    ‘errandorId’ : fields.String,
}

想要添加输出对应的枚举类型变量:

class TaskStatus(enum.Enum):
    Created = "Created"
    Publishing = "Publishing"
    Started = "Started" # == task grabbed -> consider started
    ToBeDetermine = "ToBeDetermine" # after upload info, need initiator determine
    Delivering = "Delivering" # after upload info, no need initiator determine
    Completed = "Completed"
    Canceled = "Canceled"
statusType = db.Column(db.Enum(TaskStatus), default=TaskStatus.Created)

flask-restful marshal enum

How do I marshal a list of objects? · Issue #300 · flask-restful/flask-restful · GitHub

python – Flask-restful, marshal_with + nested data – Stack Overflow

Output Fields — Flask-RESTful 0.2.1 documentation

-》

或许可以自己去实现对应的自定义字段,

然后把enum转换为对应的字符串?

API Docs — Flask-RESTful 0.2.1 documentation

去看看:

Fields

有哪些值,是否有enum

  • fields.String
  • fields.FormattedString
  • fields.Url
  • fields.DateTime
  • fields.Float
  • fields.Integer
  • fields.Arbitrary
  • fields.Nested
  • fields.List
  • fields.Raw
  • fields.Boolean
  • fields.Fixed
  • fields.Price

此处,由于enum是字符串

所以去试试:

(1)直接使用fields.String,看看是否可以正常输出对应的字符串

‘statusType’ : fields.String,

貌似没有报错。

(2)尝试fields.Raw

‘itemType’ : fields.Raw,

报错了:

  File "/usr/local/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <ItemType.Small: ‘Small’> is not JSON serializable

改为fields.String,

不过后来输出的信息是:

    "statusType": "TaskStatus.Created",
    "itemType": "ItemType.Small",

不是我此处想要的:

只保留字段,不保留类型

(3)尝试去实现自定义的格式,把enum转换为字符串

结果通过自定义:

class EnumItem(fields.Raw):
    def format(self, value):
        gLog.debug("value=%s", value)
        return "%s" % (value)
promotion_fields = {
    ‘id’ : fields.String,
    ‘sourceType’ : EnumItem(attribute="sourceType"),
    ‘type’ : EnumItem(attribute="type"),
}

结果此处还是输出的是:

"itemType": "ItemType.Small",
"statusType": "TaskStatus.Created",
DEBUG in Task [/root/RunningFast/staging/runningfast/resources/Task.py:40]:
value=ItemType.Small

<div–<——————————————————————————

<div–<——————————————————————————

DEBUG in Task [/root/RunningFast/staging/runningfast/resources/Task.py:40]:
value=RatingType.OneStar

<div–<——————————————————————————

<div–<——————————————————————————

DEBUG in Task [/root/RunningFast/staging/runningfast/resources/Task.py:40]:
value=BillType.Initiator

<div–<——————————————————————————

<div–<——————————————————————————

DEBUG in Task [/root/RunningFast/staging/runningfast/resources/Task.py:40]:
value=TipType.NoTip

<div–<——————————————————————————

<div–<——————————————————————————

DEBUG in Task [/root/RunningFast/staging/runningfast/resources/Task.py:40]:
value=TaskStatus.Created

所以此处就变成了:

【已解决】Python中如何让Enum的字符串输出字段的值而不带类型的前缀

然后此处就可以得到所需要的:

value=Small

了。

转载请注明:在路上 » 【已解决】Flask-restful中想要使用marshal格式化enum变量

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.159 seconds, using 22.11MB memory