django- concatenate(year,month)_range=[start_date,end_date] 错误

django- concatenate(year,month)_range=[start_date,end_date] error

在 SQL 中,有分隔列 "year" 和 "month",现在基于 jquery 日期时间选择器。我可以从表单中以 yyyymm 的格式获取日期条目,例如 201012。

问题是如何根据django表单日期输入范围来过滤数据库。

以下是views.py的一部分,queryset语句不正确。请帮忙指正

 if form.is_valid():
     start_date=form.cleaned_data['start_date'] <---format is like 201012>
     end_date=form.cleaned_data['end_date']          

     queryset=Result.objects.filter(concatenate(year,month)_range=[start_date,end_date])  <!--filter in database)

另一个问题是:

因为它只是 YYYYMM,所以如果我像下面这样定义 start_date,它不会匹配 html (YYYYMM) 中的日期格式。那么我怎样才能在models.py中改变呢?

我试过类似的东西:

 start_date=models.DateField(auto_now=False, auto_now_add=False,default=datetime.now().strftime("%m.%Y"))  but it is not correct.

models.py :

start_date=models.DateField(auto_now=False, auto_now_add=False)
end_date=models.DateField(auto_now=False, auto_now_add=False)

forms.py

start_date=forms.DateField(widget=DateInput(),required=False) 
end_date=forms.DateField(widget=DateInput(),required=False) 

编辑后回溯

File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in dispatch
  89.         return handler(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\list.py" in get
  159.         self.object_list = self.get_queryset()
File "C:\Users\user\Desktop\xxxx\views.py" in get_queryset
  90.             start_date = datetime.strptime(form.cleaned_data['start_date'], '%Y%m') # format is like 201012

Exception Type: TypeError at /result_list/
Exception Value: must be string, not datetime.date

要使此功能生效,您需要执行几个步骤:

  1. 配置您的表单域以接受“YYYYMM”格式的日期。在您的表格中 class:

    start_date=forms.DateField(widget=DateInput(format='%Y%m'), input_formats=['%Y%m'], required=False) 
    end_date=forms.DateField(widget=DateInput(format='%Y%m'), input_formats=['%Y%m'], required=False)
    

这将允许 Django 自动解析您的表单数据并将其正确保存为 datetime 对象。请注意,它将存储为完整日期(默认为每月的第一天)- 您不能使用 DateField 并要求它存储除完整日期以外的任何内容 .

  1. 在您的模型中,像这样设置默认值:

    start_date=models.DateField(auto_now_add=True)
    

您必须在 DateField 中存储完整的日期,所以让它默认为当前日期即可。这仍然会在下面给出正确的结果(假设该月的哪一天对您来说无关紧要)。

  1. 您的查询逻辑现在如下:

    if form.is_valid():
        # Convert the form inputs into valid datetime objects
        start_date = form.cleaned_data['start_date']
        end_date = form.cleaned_data['end_date']     
    
        # These are full dates... but we only want to compare month and year, so:
    
        queryset=Result.objects.filter(
            start_date__year__gte=start_date.year,
            start_date__month__gte=start_date.month, 
            end_date__year__lte=end_date.year,
            end_date__month__lte=end_date.month)