Поля модели, специфичные для 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
могут быть вложенными для хранения многомерных массивов.Если вы указываете поле 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).Чтобы использовать это поле, вам необходимо:
- Добавьте
'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
. Возвращаемые объекты - это те, в которых все заданные 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
который на самом деле был строкой, которая случайно оказалась в том же формате, который был выбран дляdatetime
s.
Если вы укажете поле 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
. Обозначается буквой anumrange
в базе данных и aNumericRange
в Python.
DateTimeRangeField
¶
-
класс
DateTimeRangeField
( ** варианты ) ¶ Хранит диапазон отметок времени. На основе а
DateTimeField
. Обозначается буквой atstzrange
в базе данных и aDateTimeTZRange
в Python.
DateRangeField
¶
-
класс
DateRangeField
( ** варианты ) ¶ Хранит диапазон дат. На основе а
DateField
. Обозначается буквой adaterange
в базе данных и aDateRange
в 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>]>
Поддержка 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
¶
Возвращает объекты, которые имеют включающую или исключающую нижнюю границу, в зависимости от переданного логического значения. Может быть привязан к действительным поискам для файла
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 .