您好我有一个包含以下内容的模型:
class MyModel(models.Model):
id = models.IntegerField(primary_key=True)
recorded_on = models.DateField()
precipitation = models.FloatField(null=True, blank=True)
我有一个看起来像这样的表格:
class QueryForm(forms.Form):
precipitation = forms.BooleanField(label=ugettext_lazy('Precipitation'),)
startdate = forms.DateField(widget = widgets.AdminDateWidget, label=ugettext_lazy('Start Date'),)
enddate = forms.DateField(widget = widgets.AdminDateWidget, label=ugettext_lazy('End Date'),)
在我的views.py中,我有一个表单视图和一个单独的视图,用于通过GET收集数据。这是第二个view.py的非常简化的版本:
def results(request):
if 'q' in request.GET:
...
startdate = request.GET.get('startdate', None)
enddate = request.GET.get('enddate', None)
data = MyModel.objects.filter(recorded_on__range = (startdate, enddate))
...
我在GET中的日期变量格式为' YYYY-MM-DD'。
问题是查询引发了这个错误:
coercing to Unicode: need string or buffer, datetime.date found
处理查询的日期格式的最佳方法是什么?
答案 0 :(得分:1)
我对错误消息感到有点困惑(例如,当您进行查询时,错误发生在哪里?)。
但是,我使用它将字符串从url参数转换为datetime.date:
def things_by_appointment(request, appointment_date):
'''
Things with appointment date yyyy-mm-dd
'''
try:
as_date = datetime.datetime.strptime( appointment_date, '%Y-%m-%d').date
except ValueError:
return HttpResponseBadRequest('%s is not a correct date' % appointment_date )
things = Thing.objects.filter(
Q( appointment_date = as_date ),
#...
虽然字符串来自路径而不是查询字符串,但它不应该有所作为。
答案 1 :(得分:1)
您需要从表单数据中创建Date对象,该表单数据当前是一个字符串。你得到的错误来自django试图将这些字符串与模型上的日期进行比较。
这样:
from datetime import datetime
format = '%d-%m-%Y' # Or whatever your date format is
st = datetime.strptime(startdate, format)
ed = datetime.strptime(enddate, format)
data = MyModel.objects.filter(recorded_on__range=(st.date(), ed.date()))
应该指出正确的方向。