Функции базы данных
Документированные ниже классы предоставляют пользователям способ использования функций, предоставляемых базовой базой данных, в качестве аннотаций, агрегаций или фильтров в Django. Функции также являются выражениями, поэтому они могут использоваться и комбинироваться с другими выражениями, такими как функции агрегирования.
В примерах каждой функции мы будем использовать следующую модель:
class Author(models.Model):
name = models.CharField(max_length=50)
age = models.PositiveIntegerField(null=True, blank=True)
alias = models.CharField(max_length=50, null=True, blank=True)
goes_by = models.CharField(max_length=50, null=True, blank=True)
Обычно не рекомендуется разрешать null=True для CharField, поскольку это позволяет полю иметь два «пустых значения», но это важно для примера Coalesce ниже.
Coalesce
-
class Coalesce(*expressions, **extra)[source]
Принимает список по крайней мере из двух имён полей или выражений и возвращает первое не-null значение (обратите внимание, что пустая строка не считается null-значением). Каждый аргумент должен быть одного типа, поэтому смешивание текста и чисел приведёт к ошибке базы данных.
Примеры использования:
>>> # Get a screen name from least to most public
>>> from django.db.models import Sum, Value as V
>>> from django.db.models.functions import Coalesce
>>> Author.objects.create(name='Margaret Smith', goes_by='Maggie')
>>> author = Author.objects.annotate(
... screen_name=Coalesce('alias', 'goes_by', 'name')).get()
>>> print(author.screen_name)
Maggie
>>> # Prevent an aggregate Sum() from returning None
>>> aggregated = Author.objects.aggregate(
... combined_age=Coalesce(Sum('age'), V(0)),
... combined_age_default=Sum('age'))
>>> print(aggregated['combined_age'])
0
>>> print(aggregated['combined_age_default'])
None
Предупреждение
Значение Python, переданное Coalesce в MySQL, может быть преобразовано в неверный тип, если его явно не привести к правильному типу базы данных:
>>> from django.db.models.expressions import RawSQL
>>> from django.utils import timezone
>>> now = timezone.now()
>>> now_sql = RawSQL("cast(%s as datetime)", (now,))
>>> Coalesce('updated', now_sql)
Concat
-
class Concat(*expressions, **extra)[source]
Принимает список по крайней мере из двух текстовых полей или выражений и возвращает конкатенированный текст. Каждый аргумент должен быть текстового или символьного типа. Если вы хотите конкатенировать TextField() с CharField(), убедитесь, что вы сообщили Django, что output_field должен быть TextField(). Это также необходимо при конкатенации Value, как показано в примере ниже.
Эта функция никогда не возвращает null-значение. В тех базах данных, где null-аргумент приводит к тому, что всё выражение становится null, Django будет гарантировать, что каждая null-часть будет преобразована в пустую строку.
Пример использования:
>>> # Get the display name as "name (goes_by)"
>>> from django.db.models import CharField, Value as V
>>> from django.db.models.functions import Concat
>>> Author.objects.create(name='Margaret Smith', goes_by='Maggie')
>>> author = Author.objects.annotate(
... screen_name=Concat('name', V(' ('), 'goes_by', V(')'),
... output_field=CharField())).get()
>>> print(author.screen_name)
Margaret Smith (Maggie)
Length
-
class Length(expression, **extra)[source]
Принимает одно текстовое поле или выражение и возвращает количество символов в значении. Если выражение равно null, то длина также будет null.
Пример использования:
>>> # Get the length of the name and goes_by fields
>>> from django.db.models.functions import Length
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(
... name_length=Length('name'),
... goes_by_length=Length('goes_by')).get()
>>> print(author.name_length, author.goes_by_length)
(14, None)
Lower
-
class Lower(expression, **extra)[source]
Принимает одно текстовое поле или выражение и возвращает его строчное представление.
Пример использования:
>>> from django.db.models.functions import Lower
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_lower=Lower('name')).get()
>>> print(author.name_lower)
margaret smith
Substr
-
class Substr(expression, pos, length=None, **extra)[source]
Возвращает подстроку длины length из поля или выражения, начиная с позиции pos. Позиция индексируется с 1, поэтому она должна быть больше 0. Если length равно None, будет возвращена остальная часть строки.
Пример использования:
>>> # Set the alias to the first 5 characters of the name as lowercase
>>> from django.db.models.functions import Substr, Lower
>>> Author.objects.create(name='Margaret Smith')
>>> Author.objects.update(alias=Lower(Substr('name', 1, 5)))
1
>>> print(Author.objects.get(name='Margaret Smith').alias)
marga
Upper
-
class Upper(expression, **extra)[source]
Принимает одно текстовое поле или выражение и возвращает его прописное представление.
Пример использования:
>>> from django.db.models.functions import Upper
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_upper=Upper('name')).get()
>>> print(author.name_upper)
MARGARET SMITH
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/ref/models/database-functions/