Pydantic实现属性首次设为非None值后变为不可变
需求:实现首次设置非None值后不可变的user_id字段
现有如下Pydantic模型:
from typing import Optional from pydantic import BaseModel class User(BaseModel): user_id: Optional[int] = None name: str
需要实现的规则:
user_id初始可以为None(未知状态)- 一旦被设置为非None值后,后续任何修改操作(包括改回
None)都必须抛出ValidationError - 若
user_id始终为None,重复赋值None是允许的
示例场景验证
# 场景1:创建时未指定user_id,首次赋值非None值后不可修改 user1 = User(name="John") user1.user_id = 1 # 允许:首次设置非None值 user1.user_id = 10 # 禁止:应抛出ValidationError # 场景2:创建时指定user_id为None,首次赋值非None值后不可修改 user2 = User(user_id=None, name="John") user2.user_id = 2 # 允许:首次设置非None值 user2.user_id = 20 # 禁止:应抛出ValidationError user2.user_id = None # 禁止:应抛出ValidationError # 场景3:多次赋值None后再设置非None值,之后不可修改 user3 = User(user_id=None, name="John") user3.user_id = None # 允许:值仍为None user3.user_id = 3 # 允许:首次设置非None值 user3.user_id = 30 # 禁止:应抛出ValidationError # 场景4:创建时直接指定非None的user_id,之后不可修改 user4 = User(user_id=4, name="John") user4.user_id = 40 # 禁止:应抛出ValidationError
现有方案的问题
此前找到的方案要求user_id必须初始化,导致无法执行类似user1.user_id = 1的首次赋值操作,不符合需求。
内容的提问来源于stack exchange,提问作者yada
相关产品推荐
相关产品推荐

