Даты фильтрации: TypeError в / ожидаемой строке или байтовоподобном объекте - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь сделать фильтр на основе дат для запланированных событий. Я хочу предметы, которые произошли 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 в модели. Я просто пытаюсь сделать шаги ребенка и выяснить одно, а затем использовать ИЛИ, чтобы получить другое позже. Я полагаю, это будет что-то вроде:

"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() для beginDate и stopDate, но получил ошибки, в которых говорилось, что дата и часовой пояс не определены. Я также использовал «makemigrations» и «migrate».

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 января 2019

Чтобы отфильтровать диапазон дат, как вы делаете здесь, вам нужно изменить аргументы фильтра, чтобы использовать __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 объектов стоит прочитать.

...