首页 > 解决方案 > 过滤日期:TypeError at / expected string or bytes-like object

问题描述

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

索引.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>

模型.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.

视图.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])

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

/expected string 或 bytes-like object 处的 TypeError

我认为错误在于:

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

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

任何帮助将不胜感激。

标签: djangodjango-modelsdjango-templatesdjango-views

解决方案


要像您在这里所做的那样过滤日期范围,您需要将过滤器参数更改为 use __range。通过start_date=像你在那里做的那样,你正在寻找一个start_date完全匹配的值,例如start_date= beginDate

|那里还有一个接线员。如果你想在一个范围内做 a start_date,并且end_date在一个范围内,你需要为 a 改变它,

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

如果您要start_date在日期之间或end_date日期之间说,那么您需要使用 djangoQ对象。

from django.db.models import Q


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

Q 对象的文档值得一读。


推荐阅读