Фильтр модели по времени суток в 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