Поля конкретных шаблонов PostgreSQL

Все эти поля доступны в модуле django.contrib.postgres.fields .

Индексирование этих полей

Index и Field.db_index оба создают индекс B-дерева, который не особенно полезен при запросах сложных типов данных. Лучше подходят такие индексы, как GinIndex и GistIndex , хотя выбор индекса зависит от запросов, которые вы используете. Как правило, GiST может быть хорошим выбором для полого диапазона и HStoreField , и GIN может быть полезен для ArrayField .

ArrayField

classArrayField ( base_field , size = None , ** параметры )

Поле для хранения списков данных. Можно использовать большинство типов полей; передать другой экземпляр поля в атрибуте base_field . Также можно указать размер в size . ArrayField могут быть вложенными для хранения многомерных массивов.

Если вы задаете значение default в этом поле, убедитесь, что это исполняемый объект, например list (для пустого значения по умолчанию) или исполняемый объект, который возвращает список (например, функция). Использование default=[] неверно, поскольку оно создает мутантное значение по умолчанию, которое совместно используется экземплярами ArrayField .

base_field

Этот параметр обязателен.

Определяет базовый тип данных и поведение массива. Это должен быть экземпляр подкласса Field . Например, это может быть один IntegerField или один CharField . Разрешено большинство типов полей, кроме тех, которые обрабатывают реляционные данные ( ForeignKey , OneToOneField и ManyToManyField ).

Табличные поля base_field можно вкладывать, т.е. могут содержать экземпляр ArrayField . Например :

from django.contrib.postgres.fields import ArrayField
from django.db import models

class ChessBoard(models.Model):
    board = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
    )

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

size

Это необязательный параметр.

Если присутствует, массив будет иметь указанный максимальный размер. Это значение передается в базу данных, хотя PostgreSQL в настоящее время не применяет это ограничение.

Заметка

При вложении полей ArrayField , size независимо от того, установлен параметр или нет, PostgreSQL требует, чтобы массивы были прямоугольными:

from django.contrib.postgres.fields import ArrayField
from django.db import models

class Board(models.Model):
    pieces = ArrayField(ArrayField(models.IntegerField()))

# Valid
Board(pieces=[
    [2, 3],
    [2, 1],
])

# Not valid
Board(pieces=[
    [2, 3],
    [2],
])

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

Запрос ArrayField

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

from django.contrib.postgres.fields import ArrayField
from django.db import models

class Post(models.Model):
    name = models.CharField(max_length=200)
    tags = ArrayField(models.CharField(max_length=200), blank=True)

    def __str__(self):
        return self.name

contains

Поиск contains перегружен для ArrayField . Возвращаемые объекты - это те, для которых переданные значения образуют подмножество данных. Он использует оператор SQL @> . Например :

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['tutorial', 'django'])

>>> Post.objects.filter(tags__contains=['thoughts'])
<QuerySet [<Post: First post>, <Post: Second post>]>

>>> Post.objects.filter(tags__contains=['django'])
<QuerySet [<Post: First post>, <Post: Third post>]>

>>> Post.objects.filter(tags__contains=['django', 'thoughts'])
<QuerySet [<Post: First post>]>

contained_by

Это обратный поиску contains , возвращаемые объекты - это те, для которых данные являются подмножеством переданных значений. Он использует оператор SQL <@ . Например :

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['tutorial', 'django'])

>>> Post.objects.filter(tags__contained_by=['thoughts', 'django'])
<QuerySet [<Post: First post>, <Post: Second post>]>

>>> Post.objects.filter(tags__contained_by=['thoughts', 'django', 'tutorial'])
<QuerySet [<Post: First post>, <Post: Second post>, <Post: Third post>]>

overlap

Возвращает объекты, данные которых содержат хотя бы одно значение, общее с переданными. Использует оператор SQL && . Например :

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['tutorial', 'django'])

>>> Post.objects.filter(tags__overlap=['thoughts'])
<QuerySet [<Post: First post>, <Post: Second post>]>

>>> Post.objects.filter(tags__overlap=['thoughts', 'tutorial'])
<QuerySet [<Post: First post>, <Post: Second post>, <Post: Third post>]>

len

Возвращает длину массива. После этого будут доступны поисковые запросы, доступные для полей IntegerField . Например :

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])

>>> Post.objects.filter(tags__len=1)
<QuerySet [<Post: Second post>]>

Преобразования индексов

Индекс преобразований индекса в массивах. Можно использовать любое неотрицательное целое число. Ошибка не возникает, если индекс превышает размер size массива. После преобразования доступны поисковые запросы по полю base_field . Например :

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])

>>> Post.objects.filter(tags__0='thoughts')
<QuerySet [<Post: First post>, <Post: Second post>]>

>>> Post.objects.filter(tags__1__iexact='Django')
<QuerySet [<Post: First post>]>

>>> Post.objects.filter(tags__276='javascript')
<QuerySet []>

Заметка

PostgreSQL использует индексацию с 1 для полей типа массива при написании необработанного SQL. Однако эти индексы, а также те, которые в них segmentations используются, используют индексы от 0, чтобы оставаться совместимыми с Python.

Преобразования сегментации

Преобразования сегментации сегментируются массивами. Можно использовать любую пару неотрицательных целых чисел, разделенных одним подчеркиванием. Исследование, доступное после трансформации, не меняется. Например :

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['django', 'python', 'thoughts'])

>>> Post.objects.filter(tags__0_1=['thoughts'])
<QuerySet [<Post: First post>, <Post: Second post>]>

>>> Post.objects.filter(tags__0_2__contains=['thoughts'])
<QuerySet [<Post: First post>, <Post: Second post>]>

Заметка

PostgreSQL использует индексацию с 1 для полей типа массива при написании необработанного SQL. Однако эти сегменты, а также используемые в них, indices используют индексы от 0, чтобы оставаться совместимыми с Python.

Индексы и сегментации с многомерными массивами

Когда дело доходит до индексации или сегментирования массивов с несколькими измерениями, поведение PostgreSQL довольно эзотерично. Использование индексов для доступа к вложенным данным работает в любом случае, но большинство других сегментов ведут себя странно на уровне базы данных и не могут быть последовательно и логически поддержаны Django.

Поля CIText

классCIText ( ** варианты )

Класс миксина для создания текстовых полей без учета регистра, поддерживаемых типом citext . Перед использованием ознакомьтесь с оценками производительности .

Чтобы использовать citext , используйте операцию CITextExtension для настройки расширения citext в PostgreSQL перед первой операцией миграции CreateModel .

Если вы используете поле ArrayField из CIText , вам нужно добавить 'django.contrib.postgres' в настройках INSTALLED_APPS , в противном случае значения полей отображаются в виде цепочки нравится '{thoughts,django}' .

Предусмотрено несколько полей, которые используют этот класс миксина:

классCICharField ( ** варианты )
классCIEmailField ( ** варианты )
классCITextField ( ** варианты )

Эти поля наследуются соответственно от CharField , EmailField и TextField .

max_length не будет проверяться на уровне базы данных, поскольку citext ведет себя как тип PostgreSQL text .

HStoreField

классHStoreField ( ** варианты )

Поле для хранения пар ключ-значение. Используемый тип данных Python - словарь dict . Ключи должны быть строками, а значения могут быть строками или нулевыми ( None в Python).

Чтобы использовать это поле, вы должны:

  1. Добавьте 'django.contrib.postgres' к своей настройке INSTALLED_APPS .
  2. Настройте расширение hstore в PostgreSQL.

Вы увидите такую ​​ошибку, если пропустите первый шаг или второй.can't adapt type 'dict' type "hstore" does not exist

Заметка

Иногда полезно иметь возможность ограничить, какие ключи принимаются как действительные для данного поля. Это можно сделать с помощью KeysValidator .

Запрос HStoreField

В дополнение к возможности запроса по ключу, есть несколько специальных поисков полей HStoreField .

Мы будем использовать следующий пример шаблона:

from django.contrib.postgres.fields import HStoreField
from django.db import models

class Dog(models.Model):
    name = models.CharField(max_length=200)
    data = HStoreField()

    def __str__(self):
        return self.name

Ключевые поиски

Для поиска по заданному ключу используйте этот ключ в качестве имени запроса:

>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador'})
>>> Dog.objects.create(name='Meg', data={'breed': 'collie'})

>>> Dog.objects.filter(data__breed='collie')
<QuerySet [<Dog: Meg>]>

После поиска по ключу можно объединить другие поиски в цепочку:

>>> Dog.objects.filter(data__breed__contains='l')
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>

Если ключ, который вы хотите найти, конфликтует с именем существующего поиска, вам следует использовать поиск hstorefield.contains .

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

Так как любая строка может быть ключом одного значения hstore , любой поиск, отличный от упомянутого ниже, будет интерпретироваться как поиск по ключу. Ошибка не возникает. Обратите особое внимание на опечатки и всегда проверяйте, правильно ли работают ваши запросы.

contains

Поиск contains перегружен для HStoreField . Возвращаемые объекты - это те, для которых словарь пар ключ-значение полностью содержится в поле. Он использует оператор SQL @> . Например :

>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador', 'owner': 'Bob'})
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': 'Bob'})
>>> Dog.objects.create(name='Fred', data={})

>>> Dog.objects.filter(data__contains={'owner': 'Bob'})
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>

>>> Dog.objects.filter(data__contains={'breed': 'collie'})
<QuerySet [<Dog: Meg>]>

contained_by

Это обратный поиску contains , возвращаемые объекты - это те, для которых пары ключ-значение образуют подмножество переданных значений. Он использует оператор SQL <@ . Например :

>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador', 'owner': 'Bob'})
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': 'Bob'})
>>> Dog.objects.create(name='Fred', data={})

>>> Dog.objects.filter(data__contained_by={'breed': 'collie', 'owner': 'Bob'})
<QuerySet [<Dog: Meg>, <Dog: Fred>]>

>>> Dog.objects.filter(data__contained_by={'breed': 'collie'})
<QuerySet [<Dog: Fred>]>

has_key

Возвращает объекты, данные которых содержат указанный ключ. Использует оператор SQL ? . Например :

>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador'})
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': 'Bob'})

>>> Dog.objects.filter(data__has_key='owner')
<QuerySet [<Dog: Meg>]>

has_any_keys

Возвращает объекты, данные которых содержат хотя бы один из указанных ключей. Использует оператор SQL ?| . Например :

>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador'})
>>> Dog.objects.create(name='Meg', data={'owner': 'Bob'})
>>> Dog.objects.create(name='Fred', data={})

>>> Dog.objects.filter(data__has_any_keys=['owner', 'breed'])
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>

has_keys

Возвращает объекты, данные которых содержат все указанные ключи. Использует оператор SQL ?& . Например :

>>> Dog.objects.create(name='Rufus', data={})
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': 'Bob'})

>>> Dog.objects.filter(data__has_keys=['breed', 'owner'])
<QuerySet [<Dog: Meg>]>

keys

Возвращает все ключи соответствующих объектов. Обратите внимание, что порядок не гарантируется, поэтому это преобразование особенно полезно в сочетании с поиском ArrayField . Используйте функцию SQL akeys() . Например :

>>> Dog.objects.create(name='Rufus', data={'toy': 'bone'})
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': 'Bob'})

>>> Dog.objects.filter(data__keys__overlap=['breed', 'toy'])
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>

values

Возвращает все значения соответствующих объектов. Обратите внимание, что порядок не гарантируется, поэтому это преобразование особенно полезно в сочетании с поиском ArrayField . Используйте функцию SQL avalues() . Например :

>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador'})
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': 'Bob'})

>>> Dog.objects.filter(data__values__contains=['collie'])
<QuerySet [<Dog: Meg>]>

JSONField

classJSONField ( encoder = None , ** опции )

Поле для хранения закодированных данных JSON. В Python данные представлены в соответствующем собственном формате: словари, списки, строки, числа, логические значения и None .

encoder

Необязательная кодировка классов в JSON для сериализации типов данных, не поддерживаемых стандартным сериализатором JSON ( datetime , uuid и т. Д.). Например, вы можете использовать класс DjangoJSONEncoder или любой другой класс, унаследованный от json.JSONEncoder .

Когда значение извлекается из базы данных, оно будет в формате, выбранном настраиваемым кодировщиком (чаще всего это строка), поэтому вам нужно будет вмешаться, чтобы преобразовать значение обратно в исходный тип данных ( Model.from_db() и Field.from_db_value() двоеточие ввод возможен для этого). При десериализации может потребоваться принять во внимание неопределенность, связанную с типом входного значения. Например, вы рискуете вернуть объект, datetime который на самом деле был строкой, которая была случайно в том же формате, который вы выбрали для объектов datetime .

Если вы указываете значение default в этом поле, убедитесь, что это исполняемый объект, например dict (для пустого значения по умолчанию) или исполняемый объект, который возвращает словарь (например, функция). Использование default={} неверно, поскольку оно создает мутантное значение по умолчанию, которое совместно используется экземплярами JSONField .

Заметка

PostgreSQL имеет два собственных типа данных на основе JSON: json и jsonb . Основное различие между ними заключается в том, как они хранятся и как их можно запрашивать. Поле json PostgreSQL хранится как исходное текстовое представление JSON и должно быть декодировано на лету при запросе на основе ключей. Поле jsonb хранится в соответствии с фактической структурой JSON, которая позволяет индексировать. Зато написание поля jsonb немного дороже. JSONField использует тип jsonb .

Не рекомендуется с версии 3.1: django.db.models.JSONField Вместо этого используйте .

Запрос JSONField

Подробнее см. Запрос JSONField .

Поля интервалов

Существует пять типов полей диапазона, соответствующих родным типам диапазонов PostgreSQL. Эти поля используются для хранения диапазона значений; например, время начала и окончания события или диапазон возрастов, подходящий для занятия.

Все поля диапазона преобразуются в объекты диапазона psycopg2 в Python, но также принимают кортежи в качестве входных данных, если информация о границах не требуется. По умолчанию нижняя граница включена, верхняя исключена, то есть [) (см. Документацию PostgreSQL для получения подробной информации о различных границах ).

IntegerRangeField

классIntegerRangeField ( ** варианты )

Хранит диапазон целых чисел. На основе а IntegerField . Представлен одним int4range в базе данных и одним NumericRange в Python.

Независимо от границ, указанных при сохранении данных, PostgreSQL всегда возвращает диапазон в канонической форме, который включает нижнюю границу и исключает верхнюю границу, то есть [) .

BigIntegerRangeField

классBigIntegerRangeField ( ** варианты )

Хранит диапазон расширенных целых чисел. На основе а BigIntegerField . Представлен одним int8range в базе данных и одним NumericRange в Python.

Независимо от границ, указанных при сохранении данных, PostgreSQL всегда возвращает диапазон в канонической форме, который включает нижнюю границу и исключает верхнюю границу, то есть [) .

DecimalRangeField

классDecimalRangeField ( ** варианты )

Хранит диапазон значений с плавающей запятой. На основе а DecimalField . Представлен одним numrange в базе данных и одним NumericRange в Python.

DateTimeRangeField

классDateTimeRangeField ( ** варианты )

Сохраняет интервал даты / времени. По классу DateTimeField . Представлен одним tstzrange в базе данных и одним DateTimeTZRange в Python.

DateRangeField

классDateRangeField ( ** варианты )

Хранит диапазон дат. На основе а DateField . Представлен одним daterange в базе данных и одним DateRange в Python.

Независимо от границ, указанных при сохранении данных, PostgreSQL всегда возвращает диапазон в канонической форме, который включает нижнюю границу и исключает верхнюю границу, то есть [) .

Запрос полей диапазона

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

from django.contrib.postgres.fields import IntegerRangeField
from django.db import models

class Event(models.Model):
    name = models.CharField(max_length=200)
    ages = IntegerRangeField()
    start = models.DateTimeField()

    def __str__(self):
        return self.name

Мы также будем использовать следующие примеры объектов:

>>> import datetime
>>> from django.utils import timezone
>>> now = timezone.now()
>>> Event.objects.create(name='Soft play', ages=(0, 10), start=now)
>>> Event.objects.create(name='Pub trip', ages=(21, None), start=now - datetime.timedelta(days=1))

и NumericRange :

>>> from psycopg2.extras import NumericRange

Функции контейнера

Как и в случае других полой PostgreSQL, три стандартных операторов сдерживающих доступны: contains , contained_by и , overlap соответственно , с помощью операторов SQL @> , <@ и && .

contains
>>> Event.objects.filter(ages__contains=NumericRange(4, 5))
<QuerySet [<Event: Soft play>]>
contained_by
>>> Event.objects.filter(ages__contained_by=NumericRange(0, 15))
<QuerySet [<Event: Soft play>]>

contained_by Поиск Текущая Disponible на поле типа не-диапазон: SmallAutoField , AutoField , BigAutoField , SmallIntegerField , IntegerField , BigIntegerField , DecimalField , FloatField , DateField , и DateTimeField . Например:

>>> from psycopg2.extras import DateTimeTZRange
>>> Event.objects.filter(
...     start__contained_by=DateTimeTZRange(
...         timezone.now() - datetime.timedelta(hours=1),
...         timezone.now() + datetime.timedelta(hours=1),
...     ),
... )
<QuerySet [<Event: Soft play>]>
Изменено в Django 3.1:

Поддержка SmallAutoField , AutoField , BigAutoField , SmallIntegerField , и DecimalField был добавлен.

overlap
>>> Event.objects.filter(ages__overlap=NumericRange(8, 12))
<QuerySet [<Event: Soft play>]>

Функции сравнения

Интервал поле поддерживает стандартные запросы: lt , gt , lte и gte . Они не особенно полезны, сравнение выполняется сначала по нижнему пределу, а затем, при необходимости, по верхнему пределу. Это также стратегия, принятая для сортировки по интервальному полю. Вместо этого рекомендуется использовать определенные операторы сравнения интервалов.

fully_lt

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

>>> Event.objects.filter(ages__fully_lt=NumericRange(11, 15))
<QuerySet [<Event: Soft play>]>
fully_gt

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

>>> Event.objects.filter(ages__fully_gt=NumericRange(11, 15))
<QuerySet [<Event: Pub trip>]>
not_lt

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

>>> Event.objects.filter(ages__not_lt=NumericRange(0, 15))
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
not_gt

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

>>> Event.objects.filter(ages__not_gt=NumericRange(3, 10))
<QuerySet [<Event: Soft play>]>
adjacent_to

Возвращенные интервалы имеют общую границу с переданным интервалом.

>>> Event.objects.filter(ages__adjacent_to=NumericRange(10, 21))
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>

Запросы с использованием ограничений

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

startswith

Возвращаемые объекты имеют указанную нижнюю границу. Может сопровождаться действительным поиском базового поля.

>>> Event.objects.filter(ages__startswith=21)
<QuerySet [<Event: Pub trip>]>
endswith

Возвращаемые объекты имеют указанный верхний предел. Может сопровождаться действительным поиском базового поля.

>>> Event.objects.filter(ages__endswith=10)
<QuerySet [<Event: Soft play>]>
isempty

Возвращенные объекты - это пустые интервалы. Может сопровождаться действительным поиском поля BooleanField .

>>> Event.objects.filter(ages__isempty=True)
<QuerySet []>
lower_inc
Новое в Django 3.1.

Возвращает объекты с включенными или исключительными нижними границами, в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла BooleanField .

>>> Event.objects.filter(ages__lower_inc=True)
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
lower_inf
Новое в Django 3.1.

Возвращает объекты с неограниченной (бесконечной) или ограниченной нижней границей в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла BooleanField .

>>> Event.objects.filter(ages__lower_inf=True)
<QuerySet []>
upper_inc
Новое в Django 3.1.

Возвращает объекты, у которых есть включающие или исключающие верхние границы, в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла BooleanField .

>>> Event.objects.filter(ages__upper_inc=True)
<QuerySet []>
upper_inf
Новое в Django 3.1.

Возвращает объекты с неограниченной (бесконечной) или ограниченной верхней границей в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла BooleanField .

>>> Event.objects.filter(ages__upper_inf=True)
<QuerySet [<Event: Pub trip>]>

Определение ваших собственных типов интервалов

PostgreSQL позволяет вам определять собственные типы интервалов. Реализации модели и поля формы Django используют базовые классы, указанные ниже, а psycopg2 предоставляет функцию, register_range() позволяющую использовать настраиваемые типы интервалов.

классRangeField ( ** варианты )

Базовый класс для полей шаблона интервального типа.

base_field

Используемый класс поля шаблона.

range_type

Тип используемого интервала psycopg2.

form_field

Используемый класс поля формы. Должен быть подклассом django.contrib.postgres.forms.BaseRangeField .

класс django.contrib.postgres.forms.BaseRangeField

Базовый класс для полей формы типа интервал.

base_field

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

range_type

Тип используемого интервала psycopg2.

Операторы интервалов

Новое в Django 3.0.
класс RangeOperators

PostgreSQL предоставляет набор операторов SQL, которые можно использовать с типами данных диапазона ( подробную информацию об операторах диапазона см. В документации PostgreSQL ). Этот класс разработан как служебный метод, позволяющий избежать опечаток. Имена операторов совпадают с именами соответствующего оператора запроса.

class RangeOperators:
    EQUAL = '='
    NOT_EQUAL = '<>'
    CONTAINS = '@>'
    CONTAINED_BY = '<@'
    OVERLAPS = '&&'
    FULLY_LT = '<<'
    FULLY_GT = '>>'
    NOT_LT = '&>'
    NOT_GT = '&<'
    ADJACENT_TO = '-|-'

Выражения RangeBoundary ()

Новое в Django 3.0.
classRangeBoundary ( inclusive_lower = True , inclusive_upper = False )
inclusive_lower

Если True (по умолчанию), нижняя граница включающая ( '[' ), в противном случае - исключающая ( '(' ).

inclusive_upper

Если False (по умолчанию), верхняя граница является эксклюзивной ( '(' ), в противном случае - включающей ( ']' ).

Выражение RangeBoundary() представляет пределы интервала. Его можно использовать с функцией настраиваемого интервала, которая получает пределы, например, для установки ExclusionConstraint . См. Подробную информацию в документации PostgreSQL .

Copyright ©2020 All rights reserved