Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过点使用pydantic json字段_Python_Pydantic - Fatal编程技术网

Python 如何通过点使用pydantic json字段

Python 如何通过点使用pydantic json字段,python,pydantic,Python,Pydantic,我有这样的模型、枚举、字段: from pydantic import BaseModel, Json class SlotActionEnum(Enum): NORMAL = 'normal' REASK = 'reask' class ChannelMessage(Json): answerText: str slot_action: SlotActionEnum = SlotActionEnum.NORMAL class Request(Base

我有这样的模型、枚举、字段:

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\"}"
})
这里有两个问题:

  • slot\u action
    不能像这样访问:
    o.channelMessage.slot\u action
  • 这会导致AttributeError:

    AttributeError:“dict”对象没有属性“slot\u action”

    如果我通过方括号访问此字段:

  • slot\u action
    中的值不是SlotActionEnum,而是类似于
    reask
    normal

  • slot\u 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\"}"
    })