РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
145 of 818 menu

Класс 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить