Pydantic:如何解析非字典对象

Pydantic: how to parse non dict objects

输入以下数据

data = {
    'campaigns': [
        {
            'title': 'GBP',
            'geo_segment': 'WW',
            'ac_type': 'Value',
            'conversion': 'soft',
            'asset_type': 'ALL',
            'date': '22.04.21',
            'name': 'GBP_WW_1_core_22.04.21',
            'budget': '2000',
            'cpa': '1,00'
        }
    ],
    'stages': [
        'pre',
        'post'
    ],
    'language_mode': 'all_en'
}

为了解析campaigns,我使用parse_obj()方法

campaigns = parse_obj_as(List[CampaignData], data['campaigns'])

class CampaignData(BaseModel):
    title: NonEmptyString
    geo_segment: NonEmptyString
    ......

有效。

如何验证其余数据(stagesListlanguage_modestr),这不是 dict 类型?

class GoogleCheckCampaignStages(BaseModel):
    stages: List[str]
        
    
class GoogleCheckLanguageMode(BaseModel):
    language_mode: str

如果我运行

stages = parse_obj_as(List[GoogleCheckCampaignStages], data['stages'])

returns

value is not a valid dict (type=type_error.dict)

data['language_mode'] 相同的结果。

如果我尝试使用 parse_raw_as() 方法

parse_raw_as(GoogleCheckLanguageMode, data['language_mode'])

returns

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

那么如何解析 strlist 值呢?

您遇到的错误是因为您传入的 data["stages"] 只是一个 list/array。它没有名为 stages 的密钥,因此 Pydantic 不知道如何分配它。

假设 NonEmptyString 定义如下,我建议创建一个模型来处理整个 data 对象,例如:

from pydantic import BaseModel, parse_obj_as, constr
from typing import List

NonEmptyString = constr(min_length=1)

class CampaignData(BaseModel):
    title: NonEmptyString
    geo_segment: NonEmptyString
    # and so on ...

class Data(BaseModel):
    campaigns: List[CampaignData]
    stages: List[str]
    language_mode: str

parsed_data = parse_obj_as(Data, data)
print(parsed_data)
# campaigns=[CampaignData(title='GBP', geo_segment='WW', ...)] stages=['pre', 'post'] language_mode='all_en'

如果您只想访问特定元素,您可以像这样轻松地做到这一点:

print(parsed_data.stages)
# ['pre', 'post']