Функции базы данных ¶
Классы, описанные ниже, позволяют использовать в 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
¶
-
class
Extract
( выражение , 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
¶
-
class
ExtractYear
( выражение , tzinfo = None , ** extra ) ¶ -
lookup_name = 'year'
-
-
class
ExtractIsoYear
( выражение , tzinfo = None , ** extra ) ¶ Возвращает год с номером недели в соответствии с ISO-8601.
-
lookup_name = 'iso_year'
-
-
class
ExtractMonth
( выражение , tzinfo = None , ** extra ) ¶ -
lookup_name = 'month'
-
-
class
ExtractDay
( выражение , tzinfo = None , ** extra ) ¶ -
lookup_name = 'day'
-
-
class
ExtractWeekDay
( выражение , tzinfo = None , ** extra ) ¶ -
lookup_name = 'week_day'
-
-
class
ExtractIsoWeekDay
( выражение , tzinfo = None , ** extra ) ¶ - Новое в Django 3.1.
Возвращает день недели ISO-8601, при этом день 1 - понедельник, а день 7 - воскресенье.
-
lookup_name = 'iso_week_day'
-
-
class
ExtractWeek
( выражение , tzinfo = None , ** extra ) ¶ -
lookup_name = 'week'
-
-
class
ExtractQuarter
( выражение , 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
.
-
class
ExtractHour
( выражение , tzinfo = None , ** extra ) ¶ -
lookup_name = 'hour'
-
-
class
ExtractMinute
( выражение , tzinfo = None , ** extra ) ¶ -
lookup_name = 'minute'
-
-
class
ExtractSecond
( выражение , 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
¶
-
class
Trunc
( выражение , вид , 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
для таких случаев выдает исключение.
Параметр 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
¶
-
class
TruncYear
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) ¶ -
kind = 'year'
-
-
class
TruncMonth
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) ¶ -
kind = 'month'
-
-
class
TruncWeek
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) ¶ Обрезается в полночь понедельника недели.
-
kind = 'week'
-
-
class
TruncQuarter
( выражение , 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
¶
-
class
TruncDate
( выражение , ** extra ) ¶ -
lookup_name = 'date'
-
output_field = DateField()
-
TruncDate
принудительно устанавливает тип expression
даты вместо использования усеченного оператора SQL. Он также указан как преобразование для DateTimeField
в форме __date
.
-
class
TruncTime
( выражение , ** extra ) ¶ -
lookup_name = 'time'
-
output_field = TimeField()
-
TruncTime
принудительно устанавливает тип expression
времени вместо использования усеченного оператора SQL. Он также указан как преобразование для DateTimeField
в форме __time
.
-
class
TruncDay
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) ¶ -
kind = 'day'
-
-
class
TruncHour
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) ¶ -
kind = 'hour'
-
-
class
TruncMinute
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) ¶ -
kind = 'minute'
-
-
class
TruncSecond
( выражение , 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
¶
-
class
TruncHour
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) -
kind = 'hour'
-
-
class
TruncMinute
( выражение , output_field = None , tzinfo = None , is_dst = None , ** extra ) -
kind = 'minute'
-
-
class
TruncSecond
( выражение , 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
¶
-
class
Abs
( выражение , ** 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
¶
-
class
ACos
( выражение , ** 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
¶
-
class
ASin
( выражение , ** 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
¶
-
class
ATan
( выражение , ** 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
¶
-
class
Ceil
( выражение , ** 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
¶
-
class
Cos
( выражение , ** 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
¶
-
class
Cot
( выражение , ** 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
¶
-
class
Degrees
( выражение , ** 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
¶
-
class
Exp
( выражение , ** 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
¶
-
class
Floor
( выражение , ** 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
¶
-
class
Ln
( выражение , ** 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
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
¶
-
class
Radians
( выражение , ** 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
¶
-
class
Round
( выражение , ** 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
¶
-
class
Sign
( выражение , ** extra ) ¶
Возвращает знак (-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
¶
-
class
Sin
( выражение , ** 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
¶
-
class
Sqrt
( выражение , ** 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
¶
-
class
Tan
( выражение , ** 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
¶
-
class
Chr
( выражение , ** 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
¶
-
class
Length
( выражение , ** 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
¶
-
class
Lower
( выражение , ** 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
¶
-
class
LPad
( выражение , длина , 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
¶
-
class
LTrim
( выражение , ** extra ) ¶
Аналогично Trim
, но только удаляет начальные пробелы из строки.
MD5
¶
-
class
MD5
( выражение , ** extra ) ¶
Принимает одно текстовое поле или выражение и возвращает хеш-код строки 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
¶
-
class
Ord
( выражение , ** 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
¶
-
class
Replace
( выражение , текст , замена = значение ('') , ** дополнительно ) ¶
Замените все вхождения 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
¶
-
class
Reverse
( выражение , ** 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
¶
-
class
RPad
( выражение , длина , fill_text = Value ('') , ** extra ) ¶
Аналогично LPad
, но применяет заливку к концу строки.
SHA1
, SHA224
, SHA256
, SHA384
И SHA512
¶
-
class
SHA1
( выражение , ** extra ) ¶
-
class
SHA224
( выражение , ** extra ) ¶
-
class
SHA256
( выражение , ** extra ) ¶
-
class
SHA384
( выражение , ** extra ) ¶
-
class
SHA512
( выражение , ** extra ) ¶
Принимает одно текстовое поле или выражение и возвращает соответствующий отпечаток строки.
Они также могут быть зарегистрированы как преобразования, как описано для 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
¶
-
class
Substr
( выражение , 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
¶
-
class
Trim
( выражение , ** 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
¶
-
class
Upper
( выражение , ** 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
( * выражения , ** дополнительные ) ¶
Вычисляет совокупное распределение значения в окне или разделе. Кумулятивное распределение определяется как количество строк, предшествующих текущей строке или связанных с ней, деленное на общее количество строк в интервале.
FirstValue
¶
-
class
FirstValue
( выражение , ** extra ) ¶
Возвращает оцененное значение в строке, которая является первой в интервале окна, или None
если такое значение не существует.
Lag
¶
-
class
Lag
( выражение , смещение = 1 , по умолчанию = None , ** extra ) ¶
Вычисляет смещение значения на основе offset
и, если в этом месте нет строки, возвращается default
.
default
должен иметь тот же тип, что и expression
; однако эта проверка выполняется в базе данных, а не в коде Python.
MariaDB и default
MariaDB не поддерживает этот параметр default
.
LastValue
¶
-
class
LastValue
( выражение , ** extra ) ¶
Сопоставимо с FirstValue
, возвращает последнее значение в заданном предложении диапазона.
Lead
¶
-
class
Lead
( выражение , смещение = 1 , по умолчанию = None , ** extra ) ¶
Вычисляет значение напора в заданном интервале . offset
и default
оба оцениваются относительно текущей строки.
default
должен иметь тот же тип, что и expression
; однако эта проверка выполняется в базе данных, а не в коде Python.
MariaDB и default
MariaDB не поддерживает этот параметр default
.
NthValue
¶
-
class
NthValue
( выражение , 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 или в соответствии с сортировкой всего запроса, если в интервале окна нет раздела .