Поля модели, специфичные для 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могут быть вложенными для хранения многомерных массивов.

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

base_field

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

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

Можно вкладывать поля массива - вы можете указать экземпляр ArrayFieldкак base_field. Например:

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

Индексные преобразования

Index преобразует индекс в массив. Можно использовать любое неотрицательное целое число. Ошибок нет, если оно превышает 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. Однако эти индексы и те, которые используются при slices индексировании, используют 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. Однако эти срезы и те, которые используются при indexes индексировании, основаны на 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ведет себя аналогично textтипу PostgreSQL .

Параметры сортировки без учета регистра

В PostgreSQL 12+ предпочтительнее использовать недетерминированные сопоставления вместо citextрасширения. Вы можете создать их с помощью CreateCollationоперации миграции. Дополнительные сведения см. В разделе « Управление сопоставлениями с использованием миграций» и в документации PostgreSQL о недетерминированных сопоставлениях .

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. Возвращаемые объекты - это те, в которых все заданные dictпары ключ-значение содержатся в поле. Он использует оператор 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 avals(). Например:

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

классJSONField ( кодировщик = Нет , ** параметры )

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

encoder

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

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

Если вы укажете поле a default, убедитесь, что это вызываемый объект, например dict(для пустого значения по умолчанию) или вызываемый объект, который возвращает 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. Обозначается буквой a numrangeв базе данных и a NumericRangeв Python.

DateTimeRangeField

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

Хранит диапазон отметок времени. На основе а DateTimeField. Обозначается буквой a tstzrangeв базе данных и a DateTimeTZRangeв Python.

DateRangeField

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

Хранит диапазон дат. На основе а DateField. Обозначается буквой a daterangeв базе данных и a 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Поиска также доступна на типах полей не-диапазон: 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>]>

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

Поля Range поддерживают стандартную Lookups: 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.

Диапазон операторов

класс RangeOperators

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

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

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

classRangeBoundary ( inclusive_lower = True , inclusive_upper = False )
inclusive_lower

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

inclusive_upper

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

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

Copyright ©2021 All rights reserved