Метод hour

Метод hour применяется к QuerySet и позволяет фильтровать записи по часу времени в полях типа DateTimeField. Он используется в комбинации с двойным подчеркиванием для указания поля и оператора поиска. Метод возвращает новый QuerySet с отфильтрованными записями, где час соответствует заданному значению. Фильтрация происходит на уровне базы данных, что делает ее эффективной даже на больших наборах данных.

Синтаксис

pythonModel.objects.filter(field_name__hour=value)

Пример . Использование с моделью

Рассмотрим модель Order с полем created_at типа DateTimeField и модель OrderItem для демонстрации работы фильтрации по часу:

pythonfrom 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 часов утра:

pythonfrom 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}")

Результат выполнения кода:

python"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 году:

pythonfrom 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}")

Результат выполнения кода:

python"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 часов утра:

pythonfrom 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}")

Результат выполнения кода:

python"Order 2 - Hour: 14"
"Order 4 - Hour: 9"
"Order 5 - Hour: 16"
"Order 6 - Hour: 11"
"Order 8 - Hour: 22"

Пример . Фильтрация по часу через ManyToManyField

Метод hour можно применять через связанные модели. Найдем все позиции заказов, где заказ был создан в 10 часов утра:

pythonfrom 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}")

Результат выполнения кода:

python"Product: Laptop, Quantity: 2"
"Product: Mouse, Quantity: 5"
"Product: Keyboard, Quantity: 3"

Смотрите также

  • метод minute,
    который фильтрует записи по минутам времени
  • метод second,
    который фильтрует записи по секундам времени
  • метод day,
    который фильтрует записи по дню месяца
  • метод month,
    который фильтрует записи по месяцу