过滤日期:TypeError处/预期的字符串或类似字节的对象

时间:2019-01-08 23:56:47

标签: django django-models django-templates django-views

我正在尝试根据预定事件的日期进行过滤。我想要60天前发生且计划从现在开始60天发生的项目。因此,范围的开始是今天-60天,范围的结束是今天+ 60天。我已经很长时间没有使用Django了,也不知道这是当前版本和auto_now和auto_add_now的新问题还是该问题正在使用DateField。我在模型上使用了DateField,因为我不在乎时间,也不希望将这些时间字段添加到数据库中。我要干净的日期。

Index.html

   <!DOCTYPE html>
    {% load static %}
     <title>Document</title>
     <body>
         <div id=form>
            <select name="Title" id="title_box">
                {% for item in items %}
                    <option value="{{item.name}}">{{item.name}}</option>
                {% endfor %} 
           </select>   
        </div>
      </body>
   </html>

Models.py

from __future__ import unicode_literals
from django.db import migrations, models
import datetime

class Cycle(models.Model):
    name= models.CharField(max_length=255)
    start_date = models.DateField(auto_now=False, auto_now_add=False, 
    blank=True, null=True)
    end_date = models.DateField(auto_now=False, auto_now_add=False, 
    blank=True, null=True)

我将字段从DateField更改为DateTimeField,并且没有什么区别,所以我将其更改回DateField

Views.py

from django.shortcuts import render, HttpResponse, redirect
from .models import *
import datetime

def main(request):
    beginDate = datetime.date.today() - datetime.timedelta(days=60)
    stopDate = datetime.date.today() + datetime.timedelta(days=60)
    context = {
         "items": Cycle.objects.filter(start_date=[beginDate,stopDate])
    }
    return render (request, 'app/index.html', context)

我想显示60天前发生的事件,接下来60天将发生的事件。我现在拥有的代码仅反映模型中的start_date。我只是想采取一些简单的步骤,找出一个步骤,然后再使用OR来获取另一个步骤。我想那会是这样的:

"items": Cycle.objects.filter(start_date=[beginDate,stopDate] | end_date=[beginDate, stopDate])

无论如何,我得到的错误是:

/预期的字符串或类似字节的对象处的TypeError

我认为错误在于:

context = {
         "items": Cycle.objects.filter(start_date=[beginDate,stopDate])
    }

我打印了“ beginDate”,它给了我2018-11-09,这对我想要的范围是正确的。我使用type来查看它是否可以帮助我找出不匹配的地方,并得到<class 'datetime.date'>。我现在在想,也许它与models.py不匹配,但是我不确定是否是这种情况,以及如何使它们匹配。阅读了几篇文章后,我还尝试将timezone.now()date.today()分别使用beginDatestopDate,但是出现错误,提示未定义日期和时区。我还确保使用“ makemigrations”和“ migrate”。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

要像在此处那样对日期范围进行过滤,您需要更改过滤器参数以使用__range。通过像在这里一样进行start_date=的操作,您正在寻找start_date的值,该值与例如start_date= beginDate

您还在那里有一个|运算符。如果要在某个范围内执行start_date,而在某个范围内执行end_date,则需要将其更改为,

Cycle.objects.filter(
    start_date__range=[beginDate, stopDate],
    end_date__range=[beginDate, stopDate]
)

如果要在日期之间说start_date或在日期之间说end_date,则需要使用Django Q对象。

from django.db.models import Q


Cycle.objects.filter(
    Q(start_date__range=[beginDate, stopDate]) | Q(end_date__range=[beginDate, stopDate])
)

Q objects的文档值得一读。