Функции базы данных

Классы, описанные ниже, позволяют использовать в 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 ниже.

Функции сравнения и преобразования

Cast

классCast ( выражение , output_field )

Принудительный тип результата expression , что и output_field .

Пример использования:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Cast
>>> Author.objects.create(age=25, name='Margaret Smith')
>>> author = Author.objects.annotate(
...    age_as_float=Cast('age', output_field=FloatField()),
... ).get()
>>> print(author.age_as_float)
25.0

Coalesce

классCoalesce ( * выражения , ** дополнительные )

Принимает список по крайней мере из двух имен полей или выражений и возвращает первое ненулевое значение (обратите внимание, что пустая строка не считается нулевым значением). Все параметры должны быть одного типа; если вы смешиваете текст и числа, база данных выдаст ошибку.

Примеры использования:

>>> # 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

Предупреждение

В MySQL переданное значение Python может Coalesce быть преобразовано в неправильный тип, за исключением случая, когда правильный тип базы данных явно принудительно указан:

>>> from django.db.models import DateTimeField
>>> from django.db.models.functions import Cast, Coalesce
>>> from django.utils import timezone
>>> now = timezone.now()
>>> Coalesce('updated', Cast(now, DateTimeField()))

Greatest

классGreatest ( * выражения , ** дополнительные )

Принимает список как минимум из двух имен полей или выражений и возвращает наибольшее значение. Все параметры должны быть одного типа; если вы смешиваете текст и числа, база данных выдаст ошибку.

Пример использования:

class Blog(models.Model):
    body = models.TextField()
    modified = models.DateTimeField(auto_now=True)

class Comment(models.Model):
    body = models.TextField()
    modified = models.DateTimeField(auto_now=True)
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)

>>> from django.db.models.functions import Greatest
>>> blog = Blog.objects.create(body='Greatest is the best.')
>>> comment = Comment.objects.create(body='No, Least is better.', blog=blog)
>>> comments = Comment.objects.annotate(last_updated=Greatest('modified', 'blog__modified'))
>>> annotated_comment = comments.get()

annotated_comment.last_updated будет самым последним значением между blog.modified и comment.modified .

Предупреждение

Поведение Greatest различается между базами данных, когда одно или несколько выражений имеют значение null :

  • PostgreSQL: Greatest возвращает наибольшее ненулевое выражение или null если все выражения равны null .
  • SQLite, Oracle и MySQL: если одно из выражений равно null , Greatest возвращается null .

Поведение PostgreSQL можно эмулировать, Coalesce если у вас есть адекватное минимальное значение, которое можно указать по умолчанию.

Least

классLeast ( * выражения , ** дополнительные )

Принимает список по крайней мере из двух имен полей или выражений и возвращает наименьшее значение. Все параметры должны быть одного типа; если вы смешиваете текст и числа, база данных выдаст ошибку.

Предупреждение

Поведение Least различается между базами данных, когда одно или несколько выражений имеют значение null :

  • PostgreSQL: Least возвращает наименьшее ненулевое выражение или null если все выражения равны null .
  • SQLite, Oracle и MySQL: если одно из выражений равно null , Least возвращается null .

Поведение PostgreSQL можно эмулировать, Coalesce если у вас есть адекватное максимальное значение для использования по умолчанию.

NullIf

классNullIf ( выражение1 , выражение2 )

Принимает два выражения и возвращает, None если они равны, в противном случае возвращает expression1 .

Предупреждение для Oracle

В соответствии с соглашением Oracle эта функция возвращает пустую строку, а не None выражение типа CharField .

Переход от Value(None) к expression1 запрещен в Oracle, поскольку эта база данных не принимает NULL в качестве первого параметра.

Функции даты

В примерах каждой функции мы будем использовать следующую модель:

class Experiment(models.Model):
    start_datetime = models.DateTimeField()
    start_date = models.DateField(null=True, blank=True)
    start_time = models.TimeField(null=True, blank=True)
    end_datetime = models.DateTimeField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

Extract

classExtract ( выражение , lookup_name = None , tzinfo = None , ** extra )

Извлекает компонент даты как число.

Принимает expression представитель поля DateField , DateTimeField , TimeField или DurationField и выражение имени lookup_name , и возвращает часть даты , на который ссылается в lookup_name качестве поля IntegerField . Django обычно использует функцию извлечения баз данных, поэтому можно использовать любое имя, lookup_name поддерживаемое текущей базой данных. Также можно передать подкласс tzinfo , обычно предоставляемый pytz , для извлечения значения в определенном часовом поясе.

Учитывая дату / время , возвращаются возможные значения :2015-06-15 23:30:01.000321+00:00 lookup_name

  • «Год»: 2015
  • «Iso_year» (год ISO): 2015
  • «Квартал»: 2
  • «Месяц»: 6
  • «Сутки»: 15
  • «Неделя»: 25
  • «Week_day»: 2
  • «Iso_week_day»: 1
  • «Час»: 23
  • «Минута»: 30
  • «Второй»: 1

Если Australia/Melbourne в Django активен другой часовой пояс, например , дата / время конвертируются в часовой пояс перед извлечением значения. Разница во времени Мельбурна в приведенном выше примере даты составляет +10: 00. Значения, возвращаемые, когда этот часовой пояс активен, будут такими же, как указано выше, за исключением:

  • «Сутки»: 16
  • «Week_day»: 3
  • «Iso_week_day»: 2
  • «Час»: 9

Ценности week_day

Извлечение week_day рассчитывается иначе, чем большинство стандартных баз данных и функций Python. Эта функция возвращается 1 с воскресенья, 2 с понедельника 7 по субботу.

Эквивалентный расчет в Python:

>>> from datetime import datetime
>>> dt = datetime(2015, 6, 15)
>>> (dt.isoweekday() % 7) + 1
2

Ценности week

Выражение для поиска week рассчитывается на основе стандарта ISO-8601 , т.е. неделя начинается с понедельника. Первая неделя в году - это та, которая содержит первый четверг года, то есть первую неделю в большинство (4 или более) дней в году. Возвращаемое значение находится в диапазоне от 1 до 52 или 53.

Каждое значение lookup_name выше имеет Extract соответствующий подкласс (указанный ниже), который следует использовать вместо более подробного эквивалента, т.е. ExtractYear(...) вместо .Extract(..., lookup_name='year')

Пример использования:

>>> from datetime import datetime
>>> from django.db.models.functions import Extract
>>> start = datetime(2015, 6, 15)
>>> end = datetime(2015, 7, 2)
>>> Experiment.objects.create(
...    start_datetime=start, start_date=start.date(),
...    end_datetime=end, end_date=end.date())
>>> # Add the experiment start year as a field in the QuerySet.
>>> experiment = Experiment.objects.annotate(
...    start_year=Extract('start_datetime', 'year')).get()
>>> experiment.start_year
2015
>>> # How many experiments completed in the same year in which they started?
>>> Experiment.objects.filter(
...    start_datetime__year=Extract('end_datetime', 'year')).count()
1

Извлечения DateField

classExtractYear ( выражение , tzinfo = None , ** extra )
lookup_name = 'year'
classExtractIsoYear ( выражение , tzinfo = None , ** extra )

Возвращает год с номером недели в соответствии с ISO-8601.

lookup_name = 'iso_year'
classExtractMonth ( выражение , tzinfo = None , ** extra )
lookup_name = 'month'
classExtractDay ( выражение , tzinfo = None , ** extra )
lookup_name = 'day'
classExtractWeekDay ( выражение , tzinfo = None , ** extra )
lookup_name = 'week_day'
classExtractIsoWeekDay ( выражение , tzinfo = None , ** extra )
Новое в Django 3.1.

Возвращает день недели ISO-8601, при этом день 1 - понедельник, а день 7 - воскресенье.

lookup_name = 'iso_week_day'
classExtractWeek ( выражение , tzinfo = None , ** extra )
lookup_name = 'week'
classExtractQuarter ( выражение , tzinfo = None , ** extra )
lookup_name = 'quarter'

Это логические эквиваленты . Каждый класс также зарегистрированный класс для полей и , как например. ,Extract('champ_date', lookup_name) Transform DateField DateTimeField __(lookup_name) __year

Поскольку поля DateField не имеют компонента времени, только подклассы, Extract которые применяются к частям даты, могут использоваться с DateField :

>>> from datetime import datetime
>>> from django.utils import timezone
>>> from django.db.models.functions import (
...     ExtractDay, ExtractMonth, ExtractQuarter, ExtractWeek,
...     ExtractIsoWeekDay, ExtractWeekDay, ExtractIsoYear, ExtractYear,
... )
>>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
>>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
>>> Experiment.objects.create(
...    start_datetime=start_2015, start_date=start_2015.date(),
...    end_datetime=end_2015, end_date=end_2015.date())
>>> Experiment.objects.annotate(
...     year=ExtractYear('start_date'),
...     isoyear=ExtractIsoYear('start_date'),
...     quarter=ExtractQuarter('start_date'),
...     month=ExtractMonth('start_date'),
...     week=ExtractWeek('start_date'),
...     day=ExtractDay('start_date'),
...     weekday=ExtractWeekDay('start_date'),
...     isoweekday=ExtractIsoWeekDay('start_date'),
... ).values(
...     'year', 'isoyear', 'quarter', 'month', 'week', 'day', 'weekday',
...     'isoweekday',
... ).get(end_date__year=ExtractYear('start_date'))
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
 'day': 15, 'weekday': 2, 'isoweekday': 1}

Извлечения DateTimeField

В дополнение к следующему, все экстракции для DateField перечисленных выше также могут быть использованы для DateTimeField .

classExtractHour ( выражение , tzinfo = None , ** extra )
lookup_name = 'hour'
classExtractMinute ( выражение , tzinfo = None , ** extra )
lookup_name = 'minute'
classExtractSecond ( выражение , tzinfo = None , ** extra )
lookup_name = 'second'

Это логические эквиваленты . Каждый класс также класс зарегистрирован в поле , как , например. ,Extract('champ_datetime', lookup_name) Transform DateTimeField __(lookup_name) __minute

Примеры DateTimeField :

>>> from datetime import datetime
>>> from django.utils import timezone
>>> from django.db.models.functions import (
...     ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,
...     ExtractQuarter, ExtractSecond, ExtractWeek, ExtractIsoWeekDay,
...     ExtractWeekDay, ExtractIsoYear, ExtractYear,
... )
>>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
>>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
>>> Experiment.objects.create(
...    start_datetime=start_2015, start_date=start_2015.date(),
...    end_datetime=end_2015, end_date=end_2015.date())
>>> Experiment.objects.annotate(
...     year=ExtractYear('start_datetime'),
...     isoyear=ExtractIsoYear('start_datetime'),
...     quarter=ExtractQuarter('start_datetime'),
...     month=ExtractMonth('start_datetime'),
...     week=ExtractWeek('start_datetime'),
...     day=ExtractDay('start_datetime'),
...     weekday=ExtractWeekDay('start_datetime'),
...     isoweekday=ExtractIsoWeekDay('start_datetime'),
...     hour=ExtractHour('start_datetime'),
...     minute=ExtractMinute('start_datetime'),
...     second=ExtractSecond('start_datetime'),
... ).values(
...     'year', 'isoyear', 'month', 'week', 'day',
...     'weekday', 'isoweekday', 'hour', 'minute', 'second',
... ).get(end_datetime__year=ExtractYear('start_datetime'))
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
 'day': 15, 'weekday': 2, 'isoweekday': 1, 'hour': 23, 'minute': 30,
 'second': 1}

Когда USE_TZ есть True , дата и время сохраняются в базе данных в формате UTC. Если в Django активен другой часовой пояс, дата / время конвертируются в этот часовой пояс перед извлечением значения. В приведенном ниже примере выполняется преобразование в часовой пояс Мельбурна (UTC +10: 00), который изменяет возвращаемые значения дня, дня недели и времени:

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')  # UTC+10:00
>>> with timezone.override(melb):
...    Experiment.objects.annotate(
...        day=ExtractDay('start_datetime'),
...        weekday=ExtractWeekDay('start_datetime'),
...        isoweekday=ExtractIsoWeekDay('start_datetime'),
...        hour=ExtractHour('start_datetime'),
...    ).values('day', 'weekday', 'isoweekday', 'hour').get(
...        end_datetime__year=ExtractYear('start_datetime'),
...    )
{'day': 16, 'weekday': 3, 'isoweekday': 2, 'hour': 9}

Явное изменение часового пояса для функции Extract работает таким же образом и имеет приоритет над активным часовым поясом:

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')
>>> Experiment.objects.annotate(
...     day=ExtractDay('start_datetime', tzinfo=melb),
...     weekday=ExtractWeekDay('start_datetime', tzinfo=melb),
...     isoweekday=ExtractIsoWeekDay('start_datetime', tzinfo=melb),
...     hour=ExtractHour('start_datetime', tzinfo=melb),
... ).values('day', 'weekday', 'isoweekday', 'hour').get(
...     end_datetime__year=ExtractYear('start_datetime'),
... )
{'day': 16, 'weekday': 3, 'isoweekday': 2, 'hour': 9}

Now

класс Now

Возвращает текущую дату и время сервера базы данных при выполнении запроса, обычно с использованием кода SQL CURRENT_TIMESTAMP .

Пример использования:

>>> from django.db.models.functions import Now
>>> Article.objects.filter(published__lte=Now())
<QuerySet [<Article: How to Django>]>

Замечания о PostgreSQL

В PostgreSQL оператор CURRENT_TIMESTAMP возвращает время начала текущей транзакции. Поэтому, чтобы обеспечить совместимость между базами данных, Now() используйте STATEMENT_TIMESTAMP вместо этого. Если вам нужна метка времени транзакции, используйте django.contrib.postgres.functions.TransactionNow .

Trunc

classTrunc ( выражение , вид , output_field = None , tzinfo = None , is_dst = None , ** extra )

Усекает дату до значимого компонента.

Когда вы хотите знать, произошло ли что-то в конкретный год, час или день, но не то, какая секунда Trunc (и ее подклассы) может быть полезна для фильтрации или агрегирования ваших данных. Например, вы можете использовать Trunc для расчета количества продаж в день.

Trunc принимает только одно expression , представляющее поле DateField , TimeField или DateTimeField переменную, kind представляющую часть даты или времени, и поле, output_field которое стоит DateTimeField() , TimeField() или DateField() . Он возвращает дату, время или дату / время на основе output_field , при этом для полей пока kind установлено минимальное значение. Если output_field опущен, то по умолчанию будет тип output_field из expression . Также можно передать подкласс tzinfo , обычно предоставляемый pytz , для усечения значения в определенном часовом поясе.

Параметр is_dst указывает, следует ли pytz интерпретировать несуществующие и неоднозначные часы при переходах сезонных изменений часов. По умолчанию (когда is_dst=None ) pytz для таких случаев выдает исключение.

Новое в Django 3.0:

Параметр is_dst добавлен.

Учитывая дату / время , возвращаются возможные значения :2015-06-15 14:30:50.000321+00:00 kind

  • «Год»: 2015-01-01 00: 00: 00 + 00: 00
  • «Квартал»: 2015-04-01 00: 00: 00 + 00: 00
  • «Месяц»: 2015-06-01 00: 00: 00 + 00: 00
  • «Неделя»: 2015-06-15 00: 00: 00 + 00: 00
  • «День»: 2015-06-15 00: 00: 00 + 00: 00
  • «Час»: 2015-06-15 14: 00: 00 + 00: 00
  • «Минута»: 2015-06-15 14: 30: 00 + 00: 00
  • «Второй»: 2015-06-15 14: 30: 50 + 00: 00

Если Australia/Melbourne в Django активен другой часовой пояс, например , дата / время конвертируются в новый пояс перед усечением значения. Разница во времени Мельбурна в приведенном выше примере даты составляет +10: 00. Значения, возвращаемые, когда этот часовой пояс активен, будут:

  • «Год»: 2015-01-01 00: 00: 00 + 11: 00
  • «Квартал»: 2015-04-01 00: 00: 00 + 10: 00
  • «Месяц»: 2015-06-01 00: 00: 00 + 10: 00
  • «Неделя»: 2015-06-16 00: 00: 00 + 10: 00
  • «День»: 2015-06-16 00: 00: 00 + 10: 00
  • «Час»: 2015-06-16 00: 00: 00 + 10: 00
  • «Минута»: 2015-06-16 00: 30: 00 + 10: 00
  • «Второй»: 2015-06-16 00: 30: 50 + 10: 00

Год имеет смещение +11: 00, потому что в результате происходит переход на летнее время.

Каждое значение kind выше имеет Trunc соответствующий подкласс (указанный ниже), который следует использовать вместо более подробного эквивалента, т.е. TruncYear(...) вместо .Trunc(..., kind='year')

Все подклассы определены как преобразования, но они не зарегистрированы ни в каких полях, потому что имена поиска уже зарезервированы Extract подклассами.

Пример использования:

>>> from datetime import datetime
>>> from django.db.models import Count, DateTimeField
>>> from django.db.models.functions import Trunc
>>> Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 30, 50, 321))
>>> Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 40, 2, 123))
>>> Experiment.objects.create(start_datetime=datetime(2015, 12, 25, 10, 5, 27, 999))
>>> experiments_per_day = Experiment.objects.annotate(
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
... ).values('start_day').annotate(experiments=Count('id'))
>>> for exp in experiments_per_day:
...     print(exp['start_day'], exp['experiments'])
...
2015-06-15 00:00:00 2
2015-12-25 00:00:00 1
>>> experiments = Experiment.objects.annotate(
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
... ).filter(start_day=datetime(2015, 6, 15))
>>> for exp in experiments:
...     print(exp.start_datetime)
...
2015-06-15 14:30:50.000321
2015-06-15 14:40:02.000123

Усечение DateField

classTruncYear ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'year'
classTruncMonth ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'month'
classTruncWeek ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )

Обрезается в полночь понедельника недели.

kind = 'week'
classTruncQuarter ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'quarter'

Это логические эквиваленты . Они усекают все части даты до , позволяя группировать или фильтровать даты с меньшей точностью. может иметь значение от или .Trunc('champ_date', kind) kind expression output_field DateField DateTimeField

Поскольку поля DateField не имеют компонента времени, только подклассы, Trunc которые применяются к частям даты, могут использоваться с DateField :

>>> from datetime import datetime
>>> from django.db.models import Count
>>> from django.db.models.functions import TruncMonth, TruncYear
>>> from django.utils import timezone
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
>>> start2 = datetime(2015, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
>>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
>>> Experiment.objects.create(start_datetime=start1, start_date=start1.date())
>>> Experiment.objects.create(start_datetime=start2, start_date=start2.date())
>>> Experiment.objects.create(start_datetime=start3, start_date=start3.date())
>>> experiments_per_year = Experiment.objects.annotate(
...    year=TruncYear('start_date')).values('year').annotate(
...    experiments=Count('id'))
>>> for exp in experiments_per_year:
...     print(exp['year'], exp['experiments'])
...
2014-01-01 1
2015-01-01 2

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')
>>> experiments_per_month = Experiment.objects.annotate(
...    month=TruncMonth('start_datetime', tzinfo=melb)).values('month').annotate(
...    experiments=Count('id'))
>>> for exp in experiments_per_month:
...     print(exp['month'], exp['experiments'])
...
2015-06-01 00:00:00+10:00 1
2016-01-01 00:00:00+11:00 1
2014-06-01 00:00:00+10:00 1

Усечение DateTimeField

classTruncDate ( выражение , ** extra )
lookup_name = 'date'
output_field = DateField()

TruncDate принудительно устанавливает тип expression даты вместо использования усеченного оператора SQL. Он также указан как преобразование для DateTimeField в форме __date .

classTruncTime ( выражение , ** extra )
lookup_name = 'time'
output_field = TimeField()

TruncTime принудительно устанавливает тип expression времени вместо использования усеченного оператора SQL. Он также указан как преобразование для DateTimeField в форме __time .

classTruncDay ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'day'
classTruncHour ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'hour'
classTruncMinute ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'minute'
classTruncSecond ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'second'

Это логические эквиваленты . Они усекают все части даты до , позволяя группировать или фильтровать даты / время с меньшей точностью. должен иметь значение из .Trunc('champ_dateheure', kind) kind expression output_field DateTimeField

Пример использования:

>>> from datetime import date, datetime
>>> from django.db.models import Count
>>> from django.db.models.functions import (
...     TruncDate, TruncDay, TruncHour, TruncMinute, TruncSecond,
... )
>>> from django.utils import timezone
>>> import pytz
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
>>> Experiment.objects.create(start_datetime=start1, start_date=start1.date())
>>> melb = pytz.timezone('Australia/Melbourne')
>>> Experiment.objects.annotate(
...     date=TruncDate('start_datetime'),
...     day=TruncDay('start_datetime', tzinfo=melb),
...     hour=TruncHour('start_datetime', tzinfo=melb),
...     minute=TruncMinute('start_datetime'),
...     second=TruncSecond('start_datetime'),
... ).values('date', 'day', 'hour', 'minute', 'second').get()
{'date': datetime.date(2014, 6, 15),
 'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
 'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
 'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=<UTC>),
 'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=<UTC>)
}

Усечение TimeField

classTruncHour ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'hour'
classTruncMinute ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'minute'
classTruncSecond ( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra )
kind = 'second'

Это логические эквиваленты . Они усекают все части времени до , что позволяет группировать или фильтровать часы с меньшей точностью. может иметь значение от или .Trunc('champ_heure', kind) kind expression output_field TimeField DateTimeField

Поскольку поля TimeField не имеют компонента даты, только подклассы, Trunc которые применяются к частям времени, могут использоваться с TimeField :

>>> from datetime import datetime
>>> from django.db.models import Count, TimeField
>>> from django.db.models.functions import TruncHour
>>> from django.utils import timezone
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
>>> start2 = datetime(2014, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
>>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
>>> Experiment.objects.create(start_datetime=start1, start_time=start1.time())
>>> Experiment.objects.create(start_datetime=start2, start_time=start2.time())
>>> Experiment.objects.create(start_datetime=start3, start_time=start3.time())
>>> experiments_per_hour = Experiment.objects.annotate(
...    hour=TruncHour('start_datetime', output_field=TimeField()),
... ).values('hour').annotate(experiments=Count('id'))
>>> for exp in experiments_per_hour:
...     print(exp['hour'], exp['experiments'])
...
14:00:00 2
17:00:00 1

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')
>>> experiments_per_hour = Experiment.objects.annotate(
...    hour=TruncHour('start_datetime', tzinfo=melb),
... ).values('hour').annotate(experiments=Count('id'))
>>> for exp in experiments_per_hour:
...     print(exp['hour'], exp['experiments'])
...
2014-06-16 00:00:00+10:00 2
2016-01-01 04:00:00+11:00 1

Математические функции

Мы будем использовать следующую модель в следующих примерах математических функций:

class Vector(models.Model):
    x = models.FloatField()
    y = models.FloatField()

Abs

classAbs ( выражение , ** extra )

Возвращает абсолютное значение числового поля или выражения.

Пример использования:

>>> from django.db.models.functions import Abs
>>> Vector.objects.create(x=-0.5, y=1.1)
>>> vector = Vector.objects.annotate(x_abs=Abs('x'), y_abs=Abs('y')).get()
>>> vector.x_abs, vector.y_abs
(0.5, 1.1)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Abs
>>> FloatField.register_lookup(Abs)
>>> # Get vectors inside the unit cube
>>> vectors = Vector.objects.filter(x__abs__lt=1, y__abs__lt=1)

ACos

classACos ( выражение , ** extra )

Возвращает арккосинус поля или числового выражения. Значение выражения должно быть в диапазоне от -1 до 1.

Пример использования:

>>> from django.db.models.functions import ACos
>>> Vector.objects.create(x=0.5, y=-0.9)
>>> vector = Vector.objects.annotate(x_acos=ACos('x'), y_acos=ACos('y')).get()
>>> vector.x_acos, vector.y_acos
(1.0471975511965979, 2.6905658417935308)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import ACos
>>> FloatField.register_lookup(ACos)
>>> # Get vectors whose arccosine is less than 1
>>> vectors = Vector.objects.filter(x__acos__lt=1, y__acos__lt=1)

ASin

classASin ( выражение , ** extra )

Возвращает арксинус числового поля или выражения. Значение выражения должно быть в диапазоне от -1 до 1.

Пример использования:

>>> from django.db.models.functions import ASin
>>> Vector.objects.create(x=0, y=1)
>>> vector = Vector.objects.annotate(x_asin=ASin('x'), y_asin=ASin('y')).get()
>>> vector.x_asin, vector.y_asin
(0.0, 1.5707963267948966)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import ASin
>>> FloatField.register_lookup(ASin)
>>> # Get vectors whose arcsine is less than 1
>>> vectors = Vector.objects.filter(x__asin__lt=1, y__asin__lt=1)

ATan

classATan ( выражение , ** extra )

Возвращает арктангенс числового поля или выражения.

Пример использования:

>>> from django.db.models.functions import ATan
>>> Vector.objects.create(x=3.12, y=6.987)
>>> vector = Vector.objects.annotate(x_atan=ATan('x'), y_atan=ATan('y')).get()
>>> vector.x_atan, vector.y_atan
(1.2606282660069106, 1.428638798133829)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import ATan
>>> FloatField.register_lookup(ATan)
>>> # Get vectors whose arctangent is less than 2
>>> vectors = Vector.objects.filter(x__atan__lt=2, y__atan__lt=2)

ATan2

классATan2 ( выражение1 , выражение2 , ** дополнительно )

Возвращает арктангенс .expression1 / expression2

Пример использования:

>>> from django.db.models.functions import ATan2
>>> Vector.objects.create(x=2.5, y=1.9)
>>> vector = Vector.objects.annotate(atan2=ATan2('x', 'y')).get()
>>> vector.atan2
0.9209258773829491

Ceil

classCeil ( выражение , ** extra )

Возвращает наименьшее целое число, большее или равное числовому полю или выражению.

Пример использования:

>>> from django.db.models.functions import Ceil
>>> Vector.objects.create(x=3.12, y=7.0)
>>> vector = Vector.objects.annotate(x_ceil=Ceil('x'), y_ceil=Ceil('y')).get()
>>> vector.x_ceil, vector.y_ceil
(4.0, 7.0)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Ceil
>>> FloatField.register_lookup(Ceil)
>>> # Get vectors whose ceil is less than 10
>>> vectors = Vector.objects.filter(x__ceil__lt=10, y__ceil__lt=10)

Cos

classCos ( выражение , ** extra )

Возвращает косинус числового поля или выражения.

Пример использования:

>>> from django.db.models.functions import Cos
>>> Vector.objects.create(x=-8.0, y=3.1415926)
>>> vector = Vector.objects.annotate(x_cos=Cos('x'), y_cos=Cos('y')).get()
>>> vector.x_cos, vector.y_cos
(-0.14550003380861354, -0.9999999999999986)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Cos
>>> FloatField.register_lookup(Cos)
>>> # Get vectors whose cosine is less than 0.5
>>> vectors = Vector.objects.filter(x__cos__lt=0.5, y__cos__lt=0.5)

Cot

classCot ( выражение , ** extra )

Возвращает котангенс поля или числового выражения.

Пример использования:

>>> from django.db.models.functions import Cot
>>> Vector.objects.create(x=12.0, y=1.0)
>>> vector = Vector.objects.annotate(x_cot=Cot('x'), y_cot=Cot('y')).get()
>>> vector.x_cot, vector.y_cot
(-1.5726734063976826, 0.642092615934331)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Cot
>>> FloatField.register_lookup(Cot)
>>> # Get vectors whose cotangent is less than 1
>>> vectors = Vector.objects.filter(x__cot__lt=1, y__cot__lt=1)

Degrees

classDegrees ( выражение , ** extra )

Преобразует поле или числовое выражение из радиан в градусы.

Пример использования:

>>> from django.db.models.functions import Degrees
>>> Vector.objects.create(x=-1.57, y=3.14)
>>> vector = Vector.objects.annotate(x_d=Degrees('x'), y_d=Degrees('y')).get()
>>> vector.x_d, vector.y_d
(-89.95437383553924, 179.9087476710785)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Degrees
>>> FloatField.register_lookup(Degrees)
>>> # Get vectors whose degrees are less than 360
>>> vectors = Vector.objects.filter(x__degrees__lt=360, y__degrees__lt=360)

Exp

classExp ( выражение , ** extra )

Возвращает значение e (основание натурального логарифма), возведенное в степень поля или числового выражения.

Пример использования:

>>> from django.db.models.functions import Exp
>>> Vector.objects.create(x=5.4, y=-2.0)
>>> vector = Vector.objects.annotate(x_exp=Exp('x'), y_exp=Exp('y')).get()
>>> vector.x_exp, vector.y_exp
(221.40641620418717, 0.1353352832366127)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Exp
>>> FloatField.register_lookup(Exp)
>>> # Get vectors whose exp() is greater than 10
>>> vectors = Vector.objects.filter(x__exp__gt=10, y__exp__gt=10)

Floor

classFloor ( выражение , ** extra )

Возвращает наибольшее целое число, не превышающее числовое поле или выражение.

Пример использования:

>>> from django.db.models.functions import Floor
>>> Vector.objects.create(x=5.4, y=-2.3)
>>> vector = Vector.objects.annotate(x_floor=Floor('x'), y_floor=Floor('y')).get()
>>> vector.x_floor, vector.y_floor
(5.0, -3.0)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Floor
>>> FloatField.register_lookup(Floor)
>>> # Get vectors whose floor() is greater than 10
>>> vectors = Vector.objects.filter(x__floor__gt=10, y__floor__gt=10)

Ln

classLn ( выражение , ** extra )

Возвращает натуральный логарифм числового поля или выражения.

Пример использования:

>>> from django.db.models.functions import Ln
>>> Vector.objects.create(x=5.4, y=233.0)
>>> vector = Vector.objects.annotate(x_ln=Ln('x'), y_ln=Ln('y')).get()
>>> vector.x_ln, vector.y_ln
(1.6863989535702288, 5.4510384535657)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Ln
>>> FloatField.register_lookup(Ln)
>>> # Get vectors whose value greater than e
>>> vectors = Vector.objects.filter(x__ln__gt=1, y__ln__gt=1)

Log

классLog ( выражение1 , выражение2 , ** дополнительно )

Принимает два числовых поля или выражения и возвращает логарифм первого числа по основанию второго.

Пример использования:

>>> from django.db.models.functions import Log
>>> Vector.objects.create(x=2.0, y=4.0)
>>> vector = Vector.objects.annotate(log=Log('x', 'y')).get()
>>> vector.log
2.0

Mod

классMod ( выражение1 , выражение2 , ** дополнительно )

Принимает два числовых поля или выражения и возвращает остаток от первого, деленный на второе (операция по модулю).

Пример использования:

>>> from django.db.models.functions import Mod
>>> Vector.objects.create(x=5.4, y=2.3)
>>> vector = Vector.objects.annotate(mod=Mod('x', 'y')).get()
>>> vector.mod
0.8

Pi

классPi ( ** экстра )

Возвращает значение математической константы π .

Power

классPower ( выражение1 , выражение2 , ** дополнительно )

Принимает два числовых поля или выражения и возвращает значение первого в степени второго.

Пример использования:

>>> from django.db.models.functions import Power
>>> Vector.objects.create(x=2, y=-2)
>>> vector = Vector.objects.annotate(power=Power('x', 'y')).get()
>>> vector.power
0.25

Radians

classRadians ( выражение , ** extra )

Преобразует поле или числовое выражение из градусов в радианы.

Пример использования:

>>> from django.db.models.functions import Radians
>>> Vector.objects.create(x=-90, y=180)
>>> vector = Vector.objects.annotate(x_r=Radians('x'), y_r=Radians('y')).get()
>>> vector.x_r, vector.y_r
(-1.5707963267948966, 3.141592653589793)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Radians
>>> FloatField.register_lookup(Radians)
>>> # Get vectors whose radians are less than 1
>>> vectors = Vector.objects.filter(x__radians__lt=1, y__radians__lt=1)

Round

classRound ( выражение , ** extra )

Округляет поле или числовое выражение до ближайшего целого числа. Округление средних значений (0,5) в большую или меньшую сторону зависит от используемой базы данных.

Пример использования:

>>> from django.db.models.functions import Round
>>> Vector.objects.create(x=5.4, y=-2.3)
>>> vector = Vector.objects.annotate(x_r=Round('x'), y_r=Round('y')).get()
>>> vector.x_r, vector.y_r
(5.0, -2.0)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Round
>>> FloatField.register_lookup(Round)
>>> # Get vectors whose round() is less than 20
>>> vectors = Vector.objects.filter(x__round__lt=20, y__round__lt=20)

Sign

classSign ( выражение , ** extra )
Новое в Django 3.0.

Возвращает знак (-1, 0, 1) числового поля или выражения.

Пример использования:

>>> from django.db.models.functions import Sign
>>> Vector.objects.create(x=5.4, y=-2.3)
>>> vector = Vector.objects.annotate(x_sign=Sign('x'), y_sign=Sign('y')).get()
>>> vector.x_sign, vector.y_sign
(1, -1)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Sign
>>> FloatField.register_lookup(Sign)
>>> # Get vectors whose signs of components are less than 0.
>>> vectors = Vector.objects.filter(x__sign__lt=0, y__sign__lt=0)

Sin

classSin ( выражение , ** extra )

Возвращает синус поля или числового выражения.

Пример использования:

>>> from django.db.models.functions import Sin
>>> Vector.objects.create(x=5.4, y=-2.3)
>>> vector = Vector.objects.annotate(x_sin=Sin('x'), y_sin=Sin('y')).get()
>>> vector.x_sin, vector.y_sin
(-0.7727644875559871, -0.7457052121767203)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Sin
>>> FloatField.register_lookup(Sin)
>>> # Get vectors whose sin() is less than 0
>>> vectors = Vector.objects.filter(x__sin__lt=0, y__sin__lt=0)

Sqrt

classSqrt ( выражение , ** extra )

Возвращает квадратный корень из неотрицательного числового поля или выражения.

Пример использования:

>>> from django.db.models.functions import Sqrt
>>> Vector.objects.create(x=4.0, y=12.0)
>>> vector = Vector.objects.annotate(x_sqrt=Sqrt('x'), y_sqrt=Sqrt('y')).get()
>>> vector.x_sqrt, vector.y_sqrt
(2.0, 3.46410)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Sqrt
>>> FloatField.register_lookup(Sqrt)
>>> # Get vectors whose sqrt() is less than 5
>>> vectors = Vector.objects.filter(x__sqrt__lt=5, y__sqrt__lt=5)

Tan

classTan ( выражение , ** extra )

Возвращает тангенс поля или числового выражения.

Пример использования:

>>> from django.db.models.functions import Tan
>>> Vector.objects.create(x=0, y=12)
>>> vector = Vector.objects.annotate(x_tan=Tan('x'), y_tan=Tan('y')).get()
>>> vector.x_tan, vector.y_tan
(0.0, -0.6358599286615808)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Tan
>>> FloatField.register_lookup(Tan)
>>> # Get vectors whose tangent is less than 0
>>> vectors = Vector.objects.filter(x__tan__lt=0, y__tan__lt=0)

Текстовые функции

Chr

classChr ( выражение , ** extra )

Принимает числовое поле или выражение и возвращает текстовое представление выражения в виде одного символа. Работает как функция chr() Python.

Мол Length , это может быть указано как преобразование для IntegerField . Имя запроса по умолчанию - chr .

Пример использования:

>>> from django.db.models.functions import Chr
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.filter(name__startswith=Chr(ord('M'))).get()
>>> print(author.name)
Margaret Smith

Concat

классConcat ( * выражения , ** дополнительные )

Принимает список как минимум из двух текстовых полей или полей выражения и возвращает объединение этих параметров. Каждый параметр должен иметь текстовый или символьный тип. Если вы хотите объединить поле TextField() с полем CharField() , примите меры предосторожности, сообщив Django, что результатом output_field будет поле TextField() . Это также необходимо при объединении со значением, Value как в примере ниже.

Результат этой функции никогда не равен нулю. Для движков, где нулевой параметр приводит к тому, что все выражение становится нулевым, Django сначала преобразует каждую нулевую часть в пустую строку.

Пример использования:

>>> # 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)

Left

классLeft ( выражение , длина , ** дополнительно )

Возвращает первые n ( length ) символов заданного текстового поля или выражения.

Пример использования:

>>> from django.db.models.functions import Left
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(first_initial=Left('name', 1)).get()
>>> print(author.first_initial)
M

Length

classLength ( выражение , ** extra )

Принимает одно текстовое поле или выражение и возвращает количество символов в значении. Если выражение равно нулю, возвращаемая длина также будет равна нулю.

Пример использования:

>>> # 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)

Это выражение также можно ввести как преобразование. Например :

>>> from django.db.models import CharField
>>> from django.db.models.functions import Length
>>> CharField.register_lookup(Length)
>>> # Get authors whose name is longer than 7 characters
>>> authors = Author.objects.filter(name__length__gt=7)

Lower

classLower ( выражение , ** extra )

Принимает одно текстовое поле или выражение и возвращает его представление в нижнем регистре.

Это выражение также можно зарегистрировать как преобразование, как описано для Length .

Пример использования:

>>> 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

LPad

classLPad ( выражение , длина , fill_text = Value ('') , ** extra )

Возвращает значение текстового поля или данного выражения, заполненного слева от него fill_text таким образом, чтобы длина результирующего значения содержала length символы. По умолчанию для fill_text - это пробел.

Пример использования:

>>> from django.db.models import Value
>>> from django.db.models.functions import LPad
>>> Author.objects.create(name='John', alias='j')
>>> Author.objects.update(name=LPad('name', 8, Value('abc')))
1
>>> print(Author.objects.get(alias='j').name)
abcaJohn

LTrim

classLTrim ( выражение , ** extra )

Аналогично Trim , но только удаляет начальные пробелы из строки.

MD5

classMD5 ( выражение , ** extra )
Новое в Django 3.0.

Принимает одно текстовое поле или выражение и возвращает хеш-код строки MD5.

Это выражение также можно зарегистрировать как преобразование, как описано для Length .

Пример использования:

>>> from django.db.models.functions import MD5
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_md5=MD5('name')).get()
>>> print(author.name_md5)
749fb689816b2db85f5b169c2055b247

Ord

classOrd ( выражение , ** extra )

Принимает одно текстовое поле или выражение и возвращает значение кодовой точки Unicode первого символа этого выражения. Она работает как функция ord() Python, но исключение не возникает, если выражение содержит более одного символа.

Это выражение также можно зарегистрировать как преобразование, как описано для Length . Имя запроса по умолчанию - ord .

Пример использования:

>>> from django.db.models.functions import Ord
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_code_point=Ord('name')).get()
>>> print(author.name_code_point)
77

Repeat

классRepeat ( выражение , число , ** экстра )

Возвращает многократно повторяющееся значение указанного текстового поля или выражения number .

Пример использования:

>>> from django.db.models.functions import Repeat
>>> Author.objects.create(name='John', alias='j')
>>> Author.objects.update(name=Repeat('name', 3))
1
>>> print(Author.objects.get(alias='j').name)
JohnJohnJohn

Replace

classReplace ( выражение , текст , замена = значение ('') , ** дополнительно )

Замените все вхождения text in expression на replacement . Текст замены по умолчанию - пустая строка. Параметры функции чувствительны к регистру.

Пример использования:

>>> from django.db.models import Value
>>> from django.db.models.functions import Replace
>>> Author.objects.create(name='Margaret Johnson')
>>> Author.objects.create(name='Margaret Smith')
>>> Author.objects.update(name=Replace('name', Value('Margaret'), Value('Margareth')))
2
>>> Author.objects.values('name')
<QuerySet [{'name': 'Margareth Johnson'}, {'name': 'Margareth Smith'}]>

Reverse

classReverse ( выражение , ** extra )

Принимает одно текстовое поле или выражение и возвращает символы в этом выражении в обратном порядке.

Это выражение также можно зарегистрировать как преобразование, как описано для Length . Имя запроса по умолчанию - reverse .

Пример использования:

>>> from django.db.models.functions import Reverse
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(backward=Reverse('name')).get()
>>> print(author.backward)
htimS teragraM

Right

классRight ( выражение , длина , ** дополнительно )

Возвращает length последние n ( ) символов заданного текстового поля или выражения.

Пример использования:

>>> from django.db.models.functions import Right
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(last_letter=Right('name', 1)).get()
>>> print(author.last_letter)
h

RPad

classRPad ( выражение , длина , fill_text = Value ('') , ** extra )

Аналогично LPad , но применяет заливку к концу строки.

RTrim

classRTrim ( выражение , ** extra )

Аналогично Trim , но удаляет только конечные пробелы.

SHA1 , SHA224 , SHA256 , SHA384 И SHA512

classSHA1 ( выражение , ** extra )
classSHA224 ( выражение , ** extra )
classSHA256 ( выражение , ** extra )
classSHA384 ( выражение , ** extra )
classSHA512 ( выражение , ** extra )
Новое в Django 3.0.

Принимает одно текстовое поле или выражение и возвращает соответствующий отпечаток строки.

Они также могут быть зарегистрированы как преобразования, как описано для Length .

Пример использования:

>>> from django.db.models.functions import SHA1
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_sha1=SHA1('name')).get()
>>> print(author.name_sha1)
b87efd8a6c991c390be5a68e8a7945a7851c7e5c

PostgreSQL

Расширение pgcrypto должно быть установлено. Вы можете использовать операцию миграции, CryptoExtension чтобы установить его.

оракул

Oracle не поддерживает эту функцию SHA224 .

StrIndex

классStrIndex ( строка , подстрока , ** дополнительно )

Возвращает положительное целое число, соответствующее позиции в нижнем индексе (начиная с 1) первого вхождения substring in string , или 0, если substring не найдено.

Пример использования:

>>> from django.db.models import Value as V
>>> from django.db.models.functions import StrIndex
>>> Author.objects.create(name='Margaret Smith')
>>> Author.objects.create(name='Smith, Margaret')
>>> Author.objects.create(name='Margaret Jackson')
>>> Author.objects.filter(name='Margaret Jackson').annotate(
...     smith_index=StrIndex('name', V('Smith'))
... ).get().smith_index
0
>>> authors = Author.objects.annotate(
...    smith_index=StrIndex('name', V('Smith'))
... ).filter(smith_index__gt=0)
<QuerySet [<Author: Margaret Smith>, <Author: Smith, Margaret>]>

Предупреждение

В MySQL сопоставление таблицы базы данных определяет, учитываются ли сравнения строк (например, in expression и substring эта функция). По умолчанию при сравнении регистр не учитывается.

Substr

classSubstr ( выражение , pos , length = None , ** extra )

Возвращает подстроку длины, 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 Lower, Substr
>>> 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

Trim

classTrim ( выражение , ** extra )

Возвращает значение указанного текстового поля или выражения без начальных и конечных пробелов.

Пример использования:

>>> from django.db.models.functions import Trim
>>> Author.objects.create(name='  John  ', alias='j')
>>> Author.objects.update(name=Trim('name'))
1
>>> print(Author.objects.get(alias='j').name)
John

Upper

classUpper ( выражение , ** extra )

Принимает одно текстовое поле или выражение и возвращает его представление в верхнем регистре.

Это выражение также можно зарегистрировать как преобразование, как описано для Length .

Пример использования:

>>> 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

Оконные функции

Существует ряд функций, которые можно использовать в выражении Window для вычисления положения элементов или положения Ntile определенных строк.

CumeDist

классCumeDist ( * выражения , ** дополнительные )

Вычисляет совокупное распределение значения в окне или разделе. Кумулятивное распределение определяется как количество строк, предшествующих текущей строке или связанных с ней, деленное на общее количество строк в интервале.

DenseRank

классDenseRank ( * выражения , ** дополнительные )

Эквивалентен, Rank но без «дырок».

FirstValue

classFirstValue ( выражение , ** extra )

Возвращает оцененное значение в строке, которая является первой в интервале окна, или None если такое значение не существует.

Lag

classLag ( выражение , смещение = 1 , по умолчанию = None , ** extra )

Вычисляет смещение значения на основе offset и, если в этом месте нет строки, возвращается default .

default должен иметь тот же тип, что и expression ; однако эта проверка выполняется в базе данных, а не в коде Python.

MariaDB и default

MariaDB не поддерживает этот параметр default .

LastValue

classLastValue ( выражение , ** extra )

Сопоставимо с FirstValue , возвращает последнее значение в заданном предложении диапазона.

Lead

classLead ( выражение , смещение = 1 , по умолчанию = None , ** extra )

Вычисляет значение напора в заданном интервале . offset и default оба оцениваются относительно текущей строки.

default должен иметь тот же тип, что и expression ; однако эта проверка выполняется в базе данных, а не в коде Python.

MariaDB и default

MariaDB не поддерживает этот параметр default .

NthValue

classNthValue ( выражение , nth = 1 , ** extra )

Вычисляет линию относительно смещения nth (значение должно быть положительным) внутри окна. Возвращает, None если ни одна строка не соответствует.

Некоторые базы данных по-разному обрабатывают несуществующее n-е значение. Например, Oracle возвращает пустую строку вместо None символьных выражений. В этих случаях Django не применяет никаких преобразований.

Ntile

классNtile ( num_buckets = 1 , ** дополнительно )

Вычисляет раздел для каждой строки в предложении interval, распределяя числа как можно более равномерно между 1 и num_buckets . Если строки не делятся поровну на количество «корзин», одна или несколько из них будут представлены чаще.

PercentRank

классPercentRank ( * выражения , ** дополнительные )

Вычисляет процентильный ранг строк в предложении interval. Этот расчет эквивалентен оценке

(rank - 1) / (total rows - 1)

В следующей таблице объясняется расчет процентильного ранга строки:

Номер строки Стоимость Ранг расчет Процент ранга
1 15 1 (1-1) / (7-1) 0,0000
2 20 2 (2-1) / (7-1) 0,1666
3 20 2 (2-1) / (7-1) 0,1666
4 20 2 (2-1) / (7-1) 0,1666
5 30 5 (5-1) / (7-1) 0,6666
6 30 5 (5-1) / (7-1) 0,6666
7 40 7 (7-1) / (7-1) 1,0000

Rank

классRank ( * выражения , ** дополнительные )

Подобно RowNumber этой функции, вычисляет ряд строк окна. В расчетном ряду есть дырки. Используется DenseRank для расчета ряда без отверстий.

RowNumber

классRowNumber ( * выражения , ** дополнительные )

Вычисляет номер строки в соответствии с сортировкой предложения interval или в соответствии с сортировкой всего запроса, если в интервале окна нет раздела .

Copyright ©2020 All rights reserved