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

文章来源声明: 原文作者:李可以量化; 来源站点:掘金; 原文链接:https://juejin.cn/post/7688530195554517026; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

本文把 Redis OM 字段能力讲透,适合已在用 Redis OM 或 Pydantic 的开发者,能快速落地可选字段、自动校验与常见约束,减少手写校验逻辑。

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

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

示例代码:

from typing import Optional
from redis_om import HashModel

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

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

  1. 数据校验机制

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

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

  1. 基础类型校验

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

示例模型定义:

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 永远符合邮箱格式规范
  • 所有字段的类型都与声明保持一致
  1. 复杂校验场景

10.1 创建对象时触发校验

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

示例代码:

from pydantic import ValidationError
import datetime

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

输出结果:

1 validation error <span>for</span> Customer
email
  value is not a valid email address: An email address must have an @-sign.

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

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

示例代码:

import datetime

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

<span># 修改为非法邮箱</span>
andrew.email = <span>"Not valid"</span>

try:
    andrew.save()
except ValidationError as e:
    <span>print</span>(e)

输出结果:

ValidationError: email is not a valid email address

  1. 字段值约束

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

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

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