Класс Value

Класс Value применяется в составе выражений запросов для представления постоянного значения. Он позволяет обернуть обычное значение Python в объект, который может быть использован в таких контекстах, как аннотация annotate, фильтрация filter или агрегация aggregate. В большинстве случаев Django автоматически преобразует литералы в значения, но в некоторых ситуациях требуется явное использование Value, например, при комбинировании с F-выражениями или при создании вычисляемых полей с фиксированными константами.

Класс принимает один обязательный параметр - само значение, и необязательный параметр output_field, который определяет тип поля для вывода результата. Если output_field не указан, Django попытается определить его автоматически, но для некоторых операций рекомендуется указывать его явно.

Синтаксис

pythonfrom django.db.models import Value

# Создание значения
Value(value, output_field=None)

Пример

Аннотируем статьи константным значением 'новый' в поле 'status':

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

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

python"article 1 новый"
"article 2 новый"
"article 3 новый"

Пример

Используем Value вместе с F для создания динамического поля:

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

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

python"article 1 101"
"article 2 42"
"article 3 1001"

Пример

Применим Value в условии фильтрации для сравнения с константой:

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

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

python"user1 admin"
"user2 admin"

Пример

Использование Value в агрегации для создания постоянного значения:

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

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

python"tech manual"
"news manual"
"lifestyle manual"

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

  • класс F,
    который используется для ссылки на значения полей моделей внутри запросов
  • класс Q,
    который позволяет создавать сложные условия фильтрации с помощью AND, OR и NOT
  • класс Case,
    который используется для условной аннотации значений
  • метод annotate,
    который добавляет вычисляемые поля к каждому объекту в QuerySet