Фильтр модели по времени суток в django

Мне нужно отфильтровать модель с помощью (datetime.now() < end) Моя модель

class Quiz(models.Model) :
    title = models.CharField(max_length=50)

    start = models.DateTimeFieldField(default="2021-10-10")
    end = models.DateTimeFieldField(default="2021-10-11")

Мое мнение

class GetQuizView(generics.ListAPIView) :
    def get_queryset(self):
        now = datetime.now()
        return Quiz.objects.filter(start = now)

    serializer_class = QuizListSerializer

Но я могу фильтровать только с равным временем, я не могу использовать > или <

Вы будете использовать __gt, __lt, __gte и __lte

См. документацию: https://docs.djangoproject.com/en/3.2/ref/models/expressions/

Вы можете написать свой набор запросов следующим образом

class GetQuizView(generics.ListAPIView) :
    def get_queryset(self):
        now = datetime.now()
        end = "2021-10-11"
        return Quiz.objects.filter(start__range=[end, now])
     serializer_class = QuizListSerializer

Обратите внимание, что я жестко закодировал значение конечной даты, что не является хорошей практикой, вы можете легко указать диапазон (дни) вашего фильтра, используя библиотеку datetime

Вот еще один фрагмент кода

import pytz
from datetime import date, timedelta
from django.conf import settings
#timezone aware object
today = datetime.today().astimezone(pytz.timezone(settings.TIME_ZONE))
one_week = timedelta(days=7)
end_date = today-one_week
class GetQuizView(generics.ListAPIView) :
    def get_queryset(self):
        return Quiz.objects.filter(start__range=[end_date, today])
     serializer_class = QuizListSerializer

Вы также можете использовать фильтр django __lt и __gt согласно doc

Примечание: Суть astimezone() заключается в том, чтобы сделать запрос знающим временную зону, а затем сделать так, чтобы временная зона наследовалась от конфигурации временной зоны вашего проекта, определенной в вашем проекте settings.py

Вернуться на верх