Класс Cast

Класс Cast применяется в выражениях Django ORM для приведения значений к определенному типу данных. Это может быть полезно, когда нужно изменить тип поля в запросе, чтобы корректно выполнить сравнения или использовать в вычислениях. Класс принимает два аргумента: выражение, которое требуется преобразовать, и целевой тип поля из модуля django.db.models.fields.

Синтаксис

pythonfrom django.db.models import Cast
from django.db.models.fields import IntegerField, CharField, DateField

Cast(expression, output_field)

Пример

Допустим, у нас есть модель статьи с полем 'views' типа CharField, но нам нужно выполнить над ним числовые операции. Преобразуем строку в целое число:

pythonfrom myapp.models import Article
from django.db.models import Cast, F
from django.db.models.fields import IntegerField

# Преобразуем строковое поле views в целое число
articles = Article.objects.annotate(
  views_int=Cast('views', IntegerField())
).filter(views_int__gt=1000)

for article in articles:
  print(article.title, article.views_int)

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

python"Popul ar article" 1500
"Trending post" 2300

Пример

Преобразуем числовое поле в строку для конкатенации с другим строковым значением. В модели есть поле 'rating' типа IntegerField, и мы хотим добавить префикс к рейтингу:

pythonfrom myapp.models import Article
from django.db.models import Cast, Value
from django.db.models import CharField
from django.db.models.functions import Concat

# Преобразуем рейтинг в строку и объединяем с префиксом
articles = Article.objects.annotate(
  rating_str=Cast('rating', CharField())
).annotate(
  full_rating=Concat(Value('Rating: '), 'rating_str')
)

for article in articles:
  print(article.title, article.full_rating)

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

python"Article 1" "Rating: 4"
"Article 2" "Rating: 5"

Пример

Преобразуем строковое поле с датой в тип DateField, чтобы выполнить фильтрацию по дате. В модели поле 'published_at_str' хранит дату в виде строки:

pythonfrom myapp.models import Article
from django.db.models import Cast, Q
from django.db.models.fields import DateField
from datetime import date

# Преобразуем строку в дату и фильтруем
articles = Article.objects.annotate(
  pub_date=Cast('published_at_str', DateField())
).filter(pub_date__gte=date(2025, 1, 1))

for article in articles:
  print(article.title, article.pub_date)

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

python"New Year article" 2025-01-01
"January news" 2025-01-15

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

  • класс Value,
    который позволяет создавать константные значения в выражениях
  • класс Concat,
    который объединяет строковые значения в одно поле
  • класс Coalesce,
    который возвращает первое непустое значение из списка
  • класс ExpressionWrapper,
    который оборачивает выражение с указанием типа выходного поля