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
相关产品推荐
相关产品推荐

