【问题标题】:Filtering Dates : TypeError at / expected string or bytes-like object过滤日期:TypeError at / expected string or bytes-like object
【发布时间】:2019-01-09 17:19:24
【问题描述】:

我正在尝试根据预定事件的日期进行过滤。我想要 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

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 at /expected string or bytes-like object

我认为错误在于:

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

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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案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 的文档值得一读。

    【讨论】:

    • 非常感谢。这就像一个魅力。我结束了使用 Q 对象。这是最新的 Django 版本的新功能吗?我不记得以前见过它。无论如何,感谢您抽出宝贵时间回复。
    • @FranchescaYamiquemeimporta Q 对象在 Django 中已经存在很长时间了,但直到您开始执行更复杂的查询时,它们才会真正引起注意。我已经为他们添加了指向文档的链接。
    • @markwalher_ 知道了。再次感谢您的帮助。
    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多