django - 过滤日期: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”。beginDate
stopDate
任何帮助将不胜感激。
解决方案
要像您在这里所做的那样过滤日期范围,您需要将过滤器参数更改为 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 对象的文档值得一读。
推荐阅读
- swift - 安全区域布局指南不适用于 UITableView 的 BackgroundView
- bash - 如何从 bash 循环的输出创建表格矩阵?
- javascript - 如何在不使用 slurp 标志的情况下将 JSON 序列与 jq 组合?
- grails - Grails 3,登录后的Spring Security Rest用户名
- android - Crashlytics 未上传映射文件
- r - 从嵌套数据框列表中替换数据框变量中的值
- google-app-engine - 在 Google App Engine 柔性环境中启用 CORS
- angular - NGXS - 在 actions$ 流中处理动作生命周期
- java - 如何在靶心动画中正确实现动作监听器
- python - 使用openpyxl将值复制到不同工作表中的特定列