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

Python中SQLModel日期时间字段管理及HeroUpdate模型设计疑问

在SQLModel中管理日期时间字段及HeroUpdate模型设计

针对你提出的两个问题,直接给出解决方案和解释:

1. HeroUpdate模型是否需要包含created_datetime和updated_datetime?

不需要。原因如下:

  • created_datetime是系统生成的元数据,用于记录数据创建时间,业务逻辑上不允许用户修改,因此更新接口无需暴露该字段。
  • updated_datetime是记录数据最后修改时间的字段,应由数据库自动维护更新,不需要用户在更新请求中传递,也不允许用户手动修改。

你当前的HeroUpdate模型设计是正确的,仅保留了用户可修改的业务字段(name、secret_name、age、team_id),完全符合需求。

2. 如何将日期时间字段的生成职责交给数据库?

你当前的代码已经实现了核心逻辑,这里明确关键配置要点:

针对created_datetime(创建时间)

在字段定义中使用server_default=text("now()"),让数据库在插入新记录时自动生成当前时间,无需应用层传递值:

created_datetime: datetime = Field(
    sa_column=Column(
        TIMESTAMP(timezone=True),
        nullable=False,
        server_default=text("now()")
    )
)

注意:即使HeroCreate继承了HeroBase,创建Hero时也不需要传递created_datetime参数,SQLModel会自动忽略该字段的传入,由数据库负责生成。

针对updated_datetime(更新时间)

使用server_onupdate=text("now()")配置,让数据库在每次更新记录时自动刷新该字段的值,同时建议补充server_default确保插入时也有初始值:

updated_datetime: datetime = Field(
    sa_column=Column(
        TIMESTAMP(timezone=True),
        nullable=False,
        server_default=text("now()"),
        server_onupdate=text("now()")
    )
)

补充server_default后,插入新记录时updated_datetime会和created_datetime保持一致,避免出现空值或初始值异常。

额外注意事项

  • 使用TIMESTAMP(timezone=True)确保时间带时区信息,避免不同环境下的时间偏移问题。
  • 不要在应用层手动设置这两个字段的值,完全交给数据库处理,保证数据的一致性和准确性。

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:45:23