Класс Cast
Класс Cast применяется в выражениях Django ORM для приведения
значений к определенному типу данных. Это может быть полезно,
когда нужно изменить тип поля в запросе, чтобы корректно выполнить
сравнения или использовать в вычислениях. Класс принимает два
аргумента: выражение, которое требуется преобразовать, и целевой
тип поля из модуля django.db.models.fields.
Синтаксис
from django.db.models import Cast
from django.db.models.fields import IntegerField, CharField, DateField
Cast(expression, output_field)
Пример
Допустим, у нас есть модель статьи с полем 'views'
типа CharField, но нам нужно выполнить над ним
числовые операции. Преобразуем строку в целое число:
from 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)
Результат выполнения кода:
"Popul ar article" 1500
"Trending post" 2300
Пример
Преобразуем числовое поле в строку для конкатенации с другим
строковым значением. В модели есть поле 'rating' типа
IntegerField, и мы хотим добавить префикс к рейтингу:
from 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)
Результат выполнения кода:
"Article 1" "Rating: 4"
"Article 2" "Rating: 5"
Пример
Преобразуем строковое поле с датой в тип DateField,
чтобы выполнить фильтрацию по дате. В модели поле 'published_at_str'
хранит дату в виде строки:
from 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)
Результат выполнения кода:
"New Year article" 2025-01-01
"January news" 2025-01-15
Смотрите также
-
класс
Value,
который позволяет создавать константные значения в выражениях -
класс
Concat,
который объединяет строковые значения в одно поле -
класс
Coalesce,
который возвращает первое непустое значение из списка -
класс
ExpressionWrapper,
который оборачивает выражение с указанием типа выходного поля