Метод hour
Метод hour применяется к QuerySet и позволяет
фильтровать записи по часу времени в полях типа
DateTimeField. Он используется в комбинации
с двойным подчеркиванием для указания поля и оператора
поиска. Метод возвращает новый QuerySet с отфильтрованными
записями, где час соответствует заданному значению.
Фильтрация происходит на уровне базы данных, что делает
ее эффективной даже на больших наборах данных.
Синтаксис
Model.objects.filter(field_name__hour=value)
Пример . Использование с моделью
Рассмотрим модель Order с полем created_at
типа DateTimeField и модель OrderItem
для демонстрации работы фильтрации по часу:
from django.db import models
class Order(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
is_active = models.BooleanField(default=True)
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
product_name = models.CharField(max_length=100)
quantity = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
Пример . Базовая фильтрация по часу
Давайте найдем все заказы, созданные в 10 часов утра:
from myapp.models import Order
morning_orders = Order.objects.filter(created_at__hour=10)
for order in morning_orders:
print(f"Order {order.id} created at {order.created_at}")
Результат выполнения кода:
"Order 1 created at 2026-09-05 10:15:30"
"Order 3 created at 2026-09-04 10:45:12"
"Order 7 created at 2026-09-03 10:02:45"
Пример . Комбинированная фильтрация
Метод hour можно комбинировать с другими
операторами поиска для более точной фильтрации.
Найдем заказы, созданные в 10 часов утра в 2025 году:
from myapp.models import Order
from datetime import date
filtered_orders = Order.objects.filter(
created_at__year=2025,
created_at__hour=10
)
for order in filtered_orders:
print(f"Order: {order.id}, Date: {order.created_at}")
Результат выполнения кода:
"Order: 15, Date: 2025-06-10 10:30:00"
"Order: 23, Date: 2025-08-15 10:15:45"
"Order: 31, Date: 2025-12-01 10:05:20"
Пример . С использованием метода exclude
Фильтрацию по часу можно использовать вместе с методом
exclude для исключения записей. Найдем все заказы,
которые были созданы не в 10 часов утра:
from myapp.models import Order
not_morning_orders = Order.objects.exclude(created_at__hour=10)
for order in not_morning_orders[:5]:
print(f"Order {order.id} - Hour: {order.created_at.hour}")
Результат выполнения кода:
"Order 2 - Hour: 14"
"Order 4 - Hour: 9"
"Order 5 - Hour: 16"
"Order 6 - Hour: 11"
"Order 8 - Hour: 22"
Пример . Фильтрация по часу через ManyToManyField
Метод hour можно применять через связанные
модели. Найдем все позиции заказов, где заказ был
создан в 10 часов утра:
from myapp.models import OrderItem
morning_order_items = OrderItem.objects.filter(
order__created_at__hour=10
)
for item in morning_order_items[:3]:
print(f"Product: {item.product_name}, Quantity: {item.quantity}")
Результат выполнения кода:
"Product: Laptop, Quantity: 2"
"Product: Mouse, Quantity: 5"
"Product: Keyboard, Quantity: 3"