Класс Length
Класс Length применяется в выражениях Django ORM для получения длины содержимого текстового поля. Он преобразуется в SQL-функцию LENGTH или CHAR_LENGTH в зависимости от используемой базы данных. Класс принимает выражение или имя поля и возвращает целочисленное значение длины строки. Это полезно при фильтрации, аннотации или сортировке записей по длине текста.
Синтаксис
from django.db.models.functions import Length
Length(expression, **extra)
Параметр expression может быть именем поля модели, строковым значением или другим выражением, возвращающим текст. Дополнительные аргументы передаются через **extra для настройки поведения функции.
Пример
Аннотируем статьи длиной их заголовков:
from myapp.models import Article
from django.db.models.functions import Length
articles = Article.objects.annotate(
title_length=Length('title')
).values('title', 'title_length')
for article in articles:
print(f"Title: {article['title']}, Length: {article['title_length']}")
Результат выполнения кода:
"Title: Django Basics, Length: 13"
"Title: Advanced ORM, Length: 12"
"Title: Web Development, Length: 16"
Пример
Отфильтруем статьи, длина заголовка которых больше 10 символов:
from myapp.models import Article
from django.db.models.functions import Length
long_title_articles = Article.objects.annotate(
title_length=Length('title')
).filter(title_length__gt=10)
for article in long_title_articles:
print(article.title)
Результат выполнения кода:
"Django Basics"
"Advanced ORM"
"Web Development"
Пример
Отсортируем категории по длине их названия в порядке убывания:
from myapp.models import Category
from django.db.models.functions import Length
sorted_categories = Category.objects.annotate(
name_length=Length('name')
).order_by('-name_length')
for category in sorted_categories:
print(f"{category.name} ({category.name_length})")
Результат выполнения кода:
"Programming (11)"
"Design (6)"
"Music (5)"
Пример
Используем Length вместе с F выражением для обновления полей на основе длины другого поля:
from myapp.models import Article
from django.db.models.functions import Length
from django.db.models import F
Article.objects.update(
char_count=Length('content') + F('char_count')
)
print("Articles updated with character count")
Результат выполнения кода:
"Articles updated with character count"