datetime.now()无法动态获取当前日期,需实现当前日期减7天默认值
嘿,这个问题我之前也碰到过!你踩的坑是NDB里default参数的一个常见误区——当你直接写datetime.now()+timedelta(days=-7)的时候,这个表达式会在模块第一次加载的时候就计算完成,之后不管过多久,默认值都会是那个固定的时间,完全不是你想要的“动态当前日期减7天”。
别担心,解决方法很简单,NDB的属性支持把可调用函数作为default值,这样每次创建实体的时候都会调用这个函数来生成最新的默认值。
修正后的代码
from google.appengine.ext import ndb from datetime import datetime, timedelta # 定义一个返回动态日期的函数 def default_last_login_date(): return datetime.now() - timedelta(days=7) # 写成减7天更直观,和加-7天效果一致 class ActivityCount(ndb.Model): # 注意这里传的是函数本身,不要加括号! last_login_date = ndb.DateTimeProperty(default=default_last_login_date)
为什么这样可行?
- 当你把函数名(不带括号)传给
default时,NDB不会立刻执行它,而是在每次创建新的ActivityCount实体的时候才调用这个函数。 - 这样每次生成的默认值都是调用函数时的当前日期减去7天,完美实现你想要的动态效果。
之前的错误就是因为直接传了一个计算好的日期值,而不是一个能动态生成值的函数。现在这样改完就没问题啦 😊
内容的提问来源于stack exchange,提问作者Vikram Shinde
相关产品推荐
相关产品推荐

