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

Python将日期选择器日期存入NDB模型时BadValueError报错求助

解决NDB DateProperty存储时的BadValueError问题

这个错误我之前也碰到过!核心问题很明确——你从request.get()拿到的是字符串类型的日期(比如u'2018-04-25'),但NDB的DateProperty只接受Python标准库中的datetime.date对象,直接存字符串肯定会触发BadValueError。

你的现有代码参考

模型定义

from google.appengine.ext import ndb
class Bookings(ndb.Model):
    bookingName = ndb.StringProperty()
    bookingFrom = ndb.DateProperty()

处理逻辑片段

bookingName = self.request.get('bookingName')
bookingFrom = self.request.get('bookingFrom')
user = users.get_current_user()
myuser_key = ndb.Key('MyUser', user.user_id())
# 后续尝试存入Bookings的代码...

两种实用的解决方法

方法1:手动用datetime模块转换字符串

这是最直接的方式,把前端传过来的YYYY-MM-DD格式字符串转换成date对象,记得处理格式错误的情况:

from datetime import datetime

bookingName = self.request.get('bookingName')
booking_from_str = self.request.get('bookingFrom')

# 转换字符串为date对象,同时捕获格式错误
try:
    # %Y-%m-%d对应YYYY-MM-DD格式,和大多数日期选择器的输出匹配
    bookingFrom = datetime.strptime(booking_from_str, '%Y-%m-%d').date()
except ValueError:
    # 给用户返回错误提示,避免程序崩溃
    self.response.write("请输入正确的日期格式(例如:2018-04-25)")
    return

# 正常存入NDB的逻辑
user = users.get_current_user()
myuser_key = ndb.Key('MyUser', user.user_id())
booking = Bookings(parent=myuser_key, bookingName=bookingName, bookingFrom=bookingFrom)
booking.put()

方法2:用webapp2表单工具自动转换(如果用webapp2框架)

如果你的项目基于webapp2,可以用它的表单验证组件自动处理类型转换,省掉手动写转换代码的麻烦:

from webapp2_extras import forms
from datetime import date

# 定义表单类,指定字段类型
class BookingForm(forms.Form):
    bookingName = forms.StringField(validators=[forms.validators.required()])
    bookingFrom = forms.DateField(validators=[forms.validators.required()])

# 在请求处理方法中使用表单
form = BookingForm(self.request.POST)
if form.validate():
    # 验证通过后,form.data里的bookingFrom已经是date对象了
    booking = Bookings(parent=myuser_key, **form.data)
    booking.put()
else:
    # 处理验证失败的情况,比如提示用户输入错误
    self.response.write("表单输入有误,请检查日期格式")

额外提醒

  • 一定要处理无效日期格式的情况,比如用户输入2018/04/25或者2018-02-30这种无效日期,不然会抛出未捕获的异常导致服务报错。
  • 如果你的前端日期选择器返回的不是YYYY-MM-DD格式,要对应调整strptime里的格式符(比如%d/%m/%Y对应日/月/年的格式)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:01:05