Skip to main content
 首页 » 编程设计

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

2025年05月04日33duanxz

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

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

以下是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. 

模型.py:

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

表单.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”格式的日期。在您的表单类中:

    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)