You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:30:55