Лукап time
Лукап time применяется к полям типа DateTimeField и позволяет фильтровать записи по времени, игнорируя дату. Он используется в составе поискового выражения с двойным подчеркиванием для извлечения временной части из даты-времени. Данный лукап полезен, когда требуется выбрать записи, созданные в определенное время суток, независимо от дня, месяца или года.
Синтаксис
Model.objects.filter(field__time=value)
Model.objects.filter(field__time__gte=value)
Model.objects.filter(field__time__lte=value)
Model.objects.filter(field__time__range=(start, end))
Пример
Пусть у нас есть модель Event, хранящая информацию о событиях с полем start_time типа DateTimeField:
from django.db import models
class Event(models.Model):
title = models.CharField(max_length=200)
start_time = models.DateTimeField()
def __str__(self):
return self.title
Давайте найдем все события, которые начинаются ровно в 15:30:00 (игнорируя дату):
from myapp.models import Event
from datetime import time
res = Event.objects.filter(start_time__time=time(15, 30, 0))
for event in res:
print(event.title)
Результат выполнения кода:
"Morning Workshop"
"Afternoon Meeting"
Пример
Найдем события, которые начались после 14:00:00 независимо от даты:
from myapp.models import Event
from datetime import time
res = Event.objects.filter(start_time__time__gt=time(14, 0, 0))
for event in res:
print(event.title)
Результат выполнения кода:
"Afternoon Meeting"
"Evening Concert"
Пример
Отфильтруем события, время начала которых находится в промежутке между 10:00:00 и 18:00:00:
from myapp.models import Event
from datetime import time
res = Event.objects.filter(
start_time__time__range=(time(10, 0, 0), time(18, 0, 0))
)
for event in res:
print(event.title)
Результат выполнения кода:
"Morning Workshop"
"Afternoon Meeting"
"Evening Concert"