Лукап year
Лукап year применяется к полям типа DateField и DateTimeField и позволяет отфильтровать записи по году. В качестве значения принимается целое число, обозначающее год. Лукап преобразуется в SQL-выражение EXTRACT(YEAR FROM field) = value и может использоваться в методах filter, exclude и других, поддерживающих поиск по полям.
Синтаксис
Model.objects.filter(field__year=value)
Пример
Допустим, у нас есть модель статьи с полем даты публикации:
from 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 году:
from myapp.models import Article
articles_2023 = Article.objects.filter(published_at__year=2023)
for article in articles_2023:
print(article.title)
Результат выполнения кода:
"Introduction to Python"
"Web Development Basics"
"Database Optimization"
Пример
Отфильтруем пользователей, зарегистрированных в 2022 году, и исключим записи из 2023 года:
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
registered_at = models.DateTimeField()
def __str__(self):
return self.username
from 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())
Результат выполнения кода:
"15"
"42"
Пример
Используем year в комбинации с другими операторами для более сложной фильтрации. Найдем заказы, созданные в 2024 году, у которых статус не завершен:
from 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}"
from 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")
Результат выполнения кода:
"Order 1 - active"
"Order 3 - active"
"Order 5 - active"