Класс Value
Класс Value применяется в составе выражений запросов для представления постоянного значения. Он позволяет обернуть обычное значение Python в объект, который может быть использован в таких контекстах, как аннотация annotate, фильтрация filter или агрегация aggregate. В большинстве случаев Django автоматически преобразует литералы в значения, но в некоторых ситуациях требуется явное использование Value, например, при комбинировании с F-выражениями или при создании вычисляемых полей с фиксированными константами.
Класс принимает один обязательный параметр - само значение, и необязательный параметр output_field, который определяет тип поля для вывода результата. Если output_field не указан, Django попытается определить его автоматически, но для некоторых операций рекомендуется указывать его явно.
Синтаксис
from django.db.models import Value
# Создание значения
Value(value, output_field=None)
Пример
Аннотируем статьи константным значением 'новый' в поле 'status':
from myapp.models import Article
from django.db.models import Value, CharField
# Используем output_field=CharField() для явного указания типа
articles = Article.objects.annotate(
status=Value('новый', output_field=CharField())
)
for article in articles:
print(article.title, article.status)
Результат выполнения кода:
"article 1 новый"
"article 2 новый"
"article 3 новый"
Пример
Используем Value вместе с F для создания динамического поля:
from myapp.models import Article
from django.db.models import F, Value
# Увеличиваем значение поля views на 1 и аннотируем результат как total_views
articles = Article.objects.annotate(
total_views=F('views') + Value(1)
)
for article in articles:
print(article.title, article.total_views)
Результат выполнения кода:
"article 1 101"
"article 2 42"
"article 3 1001"
Пример
Применим Value в условии фильтрации для сравнения с константой:
from myapp.models import User
from django.db.models import Value, CharField
# Аннотируем поле role_type со значением 'admin'
users = User.objects.annotate(
role_type=Value('admin', output_field=CharField())
).filter(role_type='admin')
for user in users:
print(user.username, user.role_type)
Результат выполнения кода:
"user1 admin"
"user2 admin"
Пример
Использование Value в агрегации для создания постоянного значения:
from myapp.models import Category
from django.db.models import Value, Max, Count
# Добавляем константное поле source со значением 'manual'
categories = Category.objects.annotate(
source=Value('manual', output_field=CharField())
)
for category in categories:
print(category.name, category.source)
Результат выполнения кода:
"tech manual"
"news manual"
"lifestyle manual"
Смотрите также
-
класс
F,
который используется для ссылки на значения полей моделей внутри запросов -
класс
Q,
который позволяет создавать сложные условия фильтрации с помощью AND, OR и NOT -
класс
Case,
который используется для условной аннотации значений -
метод
annotate,
который добавляет вычисляемые поля к каждому объекту вQuerySet