Лукап year

Лукап year применяется к полям типа DateField и DateTimeField и позволяет отфильтровать записи по году. В качестве значения принимается целое число, обозначающее год. Лукап преобразуется в SQL-выражение EXTRACT(YEAR FROM field) = value и может использоваться в методах filter, exclude и других, поддерживающих поиск по полям.

Синтаксис

pythonModel.objects.filter(field__year=value)

Пример

Допустим, у нас есть модель статьи с полем даты публикации:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=200)
  published_at = models.DateTimeField()

  def __str__(self):
    return self.title

Отфильтруем статьи, опубликованные в 2023 году:

pythonfrom myapp.models import Article

articles_2023 = Article.objects.filter(published_at__year=2023)
for article in articles_2023:
  print(article.title)

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

python"Introduction to Python"
"Web Development Basics"
"Database Optimization"

Пример

Отфильтруем пользователей, зарегистрированных в 2022 году, и исключим записи из 2023 года:

pythonfrom django.db import models

class User(models.Model):
  username = models.CharField(max_length=100)
  registered_at = models.DateTimeField()

  def __str__(self):
    return self.username
pythonfrom myapp.models import User

users_2022 = User.objects.filter(registered_at__year=2022)
users_not_2023 = User.objects.exclude(registered_at__year=2023)

print(users_2022.count())
print(users_not_2023.count())

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

python"15"
"42"

Пример

Используем year в комбинации с другими операторами для более сложной фильтрации. Найдем заказы, созданные в 2024 году, у которых статус не завершен:

pythonfrom django.db import models

class Order(models.Model):
  created_at = models.DateTimeField()
  is_completed = models.BooleanField(default=False)

  def __str__(self):
    return f"Order {self.id}"
pythonfrom myapp.models import Order

orders = Order.objects.filter(
  created_at__year=2024,
  is_completed=False
)
for order in orders:
  print(f"Order {order.id} - active")

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

python"Order 1 - active"
"Order 3 - active"
"Order 5 - active"

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

  • лукап month,
    который фильтрует по месяцу из поля даты
  • лукап day,
    который фильтрует по дню из поля даты
  • лукап iso_year,
    который фильтрует по ISO-году из поля даты
  • лукап quarter,
    который фильтрует по кварталу из поля даты