深入了解 Redis OM(二):字段进阶:可选字段、数据校验与约束规则

书接上回,在上一篇中我们讲解了 Redis OM 中两种核心模型 HashModel 与 JsonModel 的区别、创建方式与基础用法。本篇我们继续深入,讲解模型字段的进阶配置:可选字段定义 、数据校验机制 以及字段值约束,带你全面掌握 Redis OM 的字段能力。

7. 可选字段

在 Redis OM 中,没有设置默认值的字段默认为必填字段 。如果想要让字段变为可选(允许为空),需要使用 Python 标准库的 Optional 类型注解,并将默认值设为 None。

示例代码:

bash 复制代码
from typing import Optional
from redis_om import HashModel

class Customer(HashModel):
    first_name: str
    last_name: str
    # 可选字段,默认值为 None
    bio: Optional[str] = None

说明:Optional[str] 等价于 Python 3.10+ 中的 str | None 写法,表示该字段既可以是字符串类型,也可以是空值。

8. 数据校验机制

Redis OM 的数据校验能力底层完全依赖 Pydantic,会根据模型的类型注解在运行时自动校验数据合法性。

每一个 Redis OM 模型本质上同时也是一个 Pydantic 模型,因此你可以直接复用 Pydantic 生态中的所有校验器(例如 EmailStr、Pattern 等),无需额外开发即可实现复杂的业务校验逻辑。

9. 基础类型校验

基础的类型注解(例如 str、int、datetime.date 等)会自动开启对应的数据类型校验,无需额外配置。

示例模型定义:

bash 复制代码
import datetime
from typing import Optional
from pydantic import EmailStr
from redis_om import HashModel

class Customer(HashModel):
    first_name: str
    last_name: str
    email: EmailStr
    join_date: datetime.date
    age: int
    bio: Optional[str]

Redis OM 会自动保证:

  • first_name 永远是字符串类型
  • age 永远是整数类型
  • email 永远符合邮箱格式规范
  • 所有字段的类型都与声明保持一致

10. 复杂校验场景

10.1 创建对象时触发校验

当我们尝试传入非法值创建模型对象时,会立即触发 ValidationError 校验异常。

示例代码:

bash 复制代码
from pydantic import ValidationError
import datetime

try:
    Customer(
        first_name="Andrew",
        last_name="Brookins",
        email="Not an email address!",  # 非法邮箱格式
        join_date=datetime.date.today(),
        age=38,
        bio="Python developer, works at Redis, Inc."
    )
except ValidationError as e:
    print(e)

输出结果:

bash 复制代码
1 validation error for Customer
email
  value is not a valid email address: An email address must have an @-sign.

10.2 修改字段后保存时触发校验

如果先创建合法的模型实例,再将字段修改为非法值,调用 save() 方法持久化时同样会触发校验错误。

示例代码:

bash 复制代码
import datetime

# 创建合法对象
andrew = Customer(
    first_name="Andrew",
    last_name="Brookins",
    email="andrew.brookins@example.com",
    join_date=datetime.date.today(),
    age=38,
    bio="Python developer"
)

# 修改为非法邮箱
andrew.email = "Not valid"

try:
    andrew.save()
except ValidationError as e:
    print(e)

输出结果:

bash 复制代码
ValidationError: email is not a valid email address

11. 字段值约束

除了基础类型校验,Pydantic 还提供了丰富的字段值约束能力,所有这些约束类型都可以直接在 Redis OM 模型中使用,常见的约束场景包括:

  • 始终自动转为小写的字符串
  • 必须匹配指定正则表达式的字符串
  • 取值在指定区间内的整数
  • 必须是某个数字倍数的整数

通过组合这些约束,我们可以实现绝大多数业务场景下的字段校验需求,无需额外编写校验逻辑。

相关推荐
winfredzhang4 小时前
从零实现“照片按地理位置显示在矢量地图上”:Flask + SQLite + Leaflet 全栈实战
python·sqlite·flask
外收内放4 小时前
Python基础语法练习题(72)
开发语言·python
171320330计算机毕设编程4 小时前
计算机毕业设计 基于Hadoop的新能源汽车发展前景分析 LW PPT
java·大数据·hadoop·python·算法·随机森林·线性回归
haluhalu.4 小时前
深入理解 AI Agent(1.2):Harness 工程——模型之外的竞争力
前端·数据结构·人工智能·python·langchain·个人开发
东莞市云毅网络有限公司5 小时前
把网页表格与列表还原成结构化条目:抽取与对账实现
python·文本处理·数据抽取
夜瞬5 小时前
从零微调 Qwen3-8B:基于 LoRA 与 LLaMA-Factory 打造专属 AI 编程助教
人工智能·python·llama
小小张说故事5 小时前
Python 字典为什么这么快?一次查找背后的哈希表、扰动函数和开放寻址
python
障碍的枫子5 小时前
我的第一个Agent
开发语言·python·langchain
打工仔折腾 AI5 小时前
260+异构同步链路实战:如何用语义化自动翻译破解CDC DDL同步痛点
人工智能·后端·python·自然语言处理·性能优化·langchain·机器翻译
用户7624117567055 小时前
第十三章 网络编程
python