如何更新Pydantic嵌套列表模型中的CreateDate字段?
问题:无法更新Pydantic模型中嵌套的CreateDate字段
我基于boto3的IAM响应定义了以下Pydantic模型:
from datetime import datetime from typing import List from pydantic import BaseModel, Field class UserInfo(BaseModel): UserName: str AccessKeyId: str Status: str CreateDate: datetime.datetime class HTTPHeaders(BaseModel): server: str date: str x_amzn_requestid: str = Field(..., alias='x-amzn-requestid') class ResponseMetadata(BaseModel): RequestId: str HTTPStatusCode: int HTTPHeaders: HTTPHeaders RetryAttempts: int class ListAccessKeysModel(BaseModel): AccessKeyMetadata: List[UserInfo] IsTruncated: bool ResponseMetadata: ResponseMetadata
我需要在单元测试中修改UserInfo模型里的CreateDate字段,但尝试了多种方法都没成功,返回的数据里CreateDate始终没变化。我试过这段代码:
list_access_keys = list_access_keys_model.model_copy(update={'AccessKeyMetaData': [{'CreateDate': create_date}]})
解决方法
修正拼写错误
你代码里的AccessKeyMetaData拼写错误,模型中定义的字段名是AccessKeyMetadata(末尾为ta而非da),这是更新无效的首要原因。正确处理嵌套列表的更新
model_copy的update参数无法直接通过字典更新嵌套列表中的单个字段——因为列表内的元素是UserInfo实例,而非普通字典。你需要先取出原列表元素,修改对应字段后重新构造列表:示例代码(修改第一个AccessKey的CreateDate):
# 遍历原AccessKeyMetadata列表,更新目标字段 updated_access_keys = [] for key in list_access_keys_model.AccessKeyMetadata: # 复制UserInfo实例并更新CreateDate updated_key = key.model_copy(update={'CreateDate': create_date}) updated_access_keys.append(updated_key) # 复制ListAccessKeysModel并替换AccessKeyMetadata list_access_keys = list_access_keys_model.model_copy( update={'AccessKeyMetadata': updated_access_keys} )如果需要按特定条件修改(比如指定AccessKeyId):
target_access_key_id = "目标AccessKeyId" updated_access_keys = [] for key in list_access_keys_model.AccessKeyMetadata: if key.AccessKeyId == target_access_key_id: updated_key = key.model_copy(update={'CreateDate': create_date}) updated_access_keys.append(updated_key) else: updated_access_keys.append(key) list_access_keys = list_access_keys_model.model_copy( update={'AccessKeyMetadata': updated_access_keys} )批量更新简化写法(可选)
若要批量更新所有UserInfo的CreateDate,可以用列表推导式简化代码:updated_access_keys = [ key.model_copy(update={'CreateDate': create_date}) for key in list_access_keys_model.AccessKeyMetadata ] list_access_keys = list_access_keys_model.model_copy( update={'AccessKeyMetadata': updated_access_keys} )
内容的提问来源于stack exchange,提问作者user24962262
相关产品推荐
相关产品推荐

