簡體   English   中英

如何通過點使用 pydantic json 字段

[英]How to work with pydantic json field through dot

我有這樣的 model,枚舉,字段:

from pydantic import BaseModel, Json

class SlotActionEnum(Enum):
    NORMAL = 'normal'
    REASK = 'reask'


class ChannelMessage(Json):
    answerText: str
    slot_action: SlotActionEnum = SlotActionEnum.NORMAL 


class Request(BaseModel):
    conversationId: str
    channelMessage: ChannelMessage



o = Request(**{
    "conversationId": "id10",
    "channelMessage": "{\"answerText\": \"sadfg\", \"slot_action\": \"reask\"}"
})

這里有兩個問題:

  1. slot_action不能這樣訪問: o.channelMessage.slot_action

這會導致 AttributeError:

AttributeError: 'dict' object 沒有屬性 'slot_action'

如果我通過方括號 PyCharm 突出顯示該字段:

在此處輸入圖像描述

  1. slot_action中的值不是 SlotActionEnum 而是像reasknormal

  2. slot_action可以是空字符串。 我怎樣才能將空字符串替換為normal

我應該怎么做才能處理這些問題? 我應該做這樣的事情:

class ChannelMessage(BaseModel):
    answerText: str
    slot_action: SlotActionEnum = SlotActionEnum.NORMAL

class Request(BaseModel):
    conversationId: str
    channelMessage: ChannelMessage

    def __init__(__pydantic_self__, **data: Any) -> None:
        channel_message = json.loads(data.pop('channelMessage'))
        if channel_message['slot_action'] == '':
            channel_message['slot_action'] = SlotActionEnum.NORMAL.value
        channel_message['slot_action'] = SlotActionEnum(channel_message['slot_action'])
        super().__init__(**data, channelMessage=channel_message)

? 很好,但看起來很難看。

from pydantic import BaseModel, validator
from enum import Enum


class SlotActionEnum(Enum):
    NORMAL = 'normal'
    REASK = 'reask'


class ChannelMessage(BaseModel):
    answerText: str
    slot_action: SlotActionEnum = SlotActionEnum.NORMAL

    @validator("slot_action", pre=True)
    def valid_slot_action(cls, v):
        if v == "":
            return SlotActionEnum.NORMAL
        return v


class Request(BaseModel):
    conversationId: str
    channelMessage: ChannelMessage

    @validator("channelMessage", pre=True)
    def valid_channel_message(cls, v):
        if isinstance(v, str):
            return ChannelMessage.parse_raw(v)
        return v


o = Request(**{
    "conversationId": "id10",
    "channelMessage": "{\"answerText\": \"sadfg\", \"slot_action\": \"reask\"}"
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM