Поля конкретных шаблонов PostgreSQL ¶
Все эти поля доступны в модуле django.contrib.postgres.fields
.
Индексирование этих полей ¶
Index
и Field.db_index
оба создают индекс B-дерева, который не особенно полезен при запросах сложных типов данных. Лучше подходят такие индексы, как GinIndex
и
GistIndex
, хотя выбор индекса зависит от запросов, которые вы используете. Как правило, GiST может быть хорошим выбором для полого диапазона и
HStoreField
, и GIN может быть полезен для ArrayField
.
ArrayField
¶
-
class
ArrayField
( 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
ведет себя как тип PostgreSQLtext
.
HStoreField
¶
-
класс
HStoreField
( ** варианты ) ¶ Поле для хранения пар ключ-значение. Используемый тип данных Python - словарь
dict
. Ключи должны быть строками, а значения могут быть строками или нулевыми (None
в Python).Чтобы использовать это поле, вы должны:
- Добавьте
'django.contrib.postgres'
к своей настройкеINSTALLED_APPS
. - Настройте расширение 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
¶
-
class
JSONField
( 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>]>
Поддержка 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
¶
Возвращает объекты с включенными или исключительными нижними границами, в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла
BooleanField
.
>>> Event.objects.filter(ages__lower_inc=True)
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
lower_inf
¶
Возвращает объекты с неограниченной (бесконечной) или ограниченной нижней границей в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла
BooleanField
.
>>> Event.objects.filter(ages__lower_inf=True)
<QuerySet []>
upper_inc
¶
Возвращает объекты, у которых есть включающие или исключающие верхние границы, в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла
BooleanField
.
>>> Event.objects.filter(ages__upper_inc=True)
<QuerySet []>
upper_inf
¶
Возвращает объекты с неограниченной (бесконечной) или ограниченной верхней границей в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла
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
.
-
Операторы интервалов ¶
-
класс
RangeOperators
¶
PostgreSQL предоставляет набор операторов SQL, которые можно использовать с типами данных диапазона ( подробную информацию об операторах диапазона см. В документации PostgreSQL ). Этот класс разработан как служебный метод, позволяющий избежать опечаток. Имена операторов совпадают с именами соответствующего оператора запроса.
class RangeOperators:
EQUAL = '='
NOT_EQUAL = '<>'
CONTAINS = '@>'
CONTAINED_BY = '<@'
OVERLAPS = '&&'
FULLY_LT = '<<'
FULLY_GT = '>>'
NOT_LT = '&>'
NOT_GT = '&<'
ADJACENT_TO = '-|-'
Выражения RangeBoundary () ¶
-
class
RangeBoundary
( inclusive_lower = True , inclusive_upper = False ) ¶ -
inclusive_lower
¶ Если
True
(по умолчанию), нижняя граница включающая ('['
), в противном случае - исключающая ('('
).
-
inclusive_upper
¶ Если
False
(по умолчанию), верхняя граница является эксклюзивной ('('
), в противном случае - включающей (']'
).
-
Выражение RangeBoundary()
представляет пределы интервала. Его можно использовать с функцией настраиваемого интервала, которая получает пределы, например, для установки ExclusionConstraint
. См. Подробную информацию в документации PostgreSQL .