PostgreSQL固有のモデルフィールド—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/contrib/postgres/fields
移動先:案内検索

PostgreSQL固有のモデルフィールド

これらのフィールドはすべて、django.contrib.postgres.fieldsモジュールから利用できます。

これらのフィールドのインデックス作成

IndexField.db_index はどちらもBツリーインデックスを作成します。これは、複雑なデータ型をクエリする場合には特に役立ちません。 GinIndexGistIndex などのインデックスの方が適していますが、インデックスの選択は使用しているクエリによって異なります。 一般に、GiSTは範囲フィールドおよび HStoreField に適している可能性があり、GINは ArrayField に役立つ可能性があります。


ArrayField

class ArrayField(base_field, size=None, **options)

データのリストを格納するためのフィールド。 ほとんどのフィールドタイプを使用でき、別のフィールドインスタンスを base_field として渡します。 サイズを指定することもできます。 ArrayFieldは、多次元配列を格納するためにネストできます。

フィールドに default を指定する場合は、list(空のデフォルトの場合)などの呼び出し可能オブジェクト、またはリストを返す呼び出し可能オブジェクト(関数など)であることを確認してください。 default=[]を誤って使用すると、ArrayFieldのすべてのインスタンス間で共有される可変のデフォルトが作成されます。

base_field

これは必須の引数です。

配列の基になるデータ型と動作を指定します。 Field のサブクラスのインスタンスである必要があります。 たとえば、 IntegerField または CharField の場合があります。 リレーショナルデータを処理するもの( ForeignKeyOneToOneFieldManyToManyField )を除いて、ほとんどのフィールドタイプが許可されます。

配列フィールドをネストすることができます-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

:lookup: `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

これは、 :lookup: `含む ` ルックアップ-返されるオブジェクトは、データが渡された値のサブセットであるオブジェクトになります。 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は、インデックスを配列に変換します。 負でない整数はすべて使用できます。 配列のサイズを超えてもエラーはありません。 変換後に使用できるルックアップは、 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は、生のSQLを作成するときに、配列フィールドに1ベースのインデックスを使用します。 ただし、これらのインデックスとで使用されるインデックス :lookup: `スライス ` Pythonとの一貫性を保つために、0ベースのインデックスを使用します。


スライス変換

スライス変換は、配列のスライスを取得します。 1つのアンダースコアで区切って、任意の2つの非負の整数を使用できます。 変換後に使用可能なルックアップは変更されません。 例えば:

>>> 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は、生のSQLを作成するときに、配列フィールドに1ベースのインデックスを使用します。 ただし、これらのスライスとで使用されるスライス :lookup: `インデックス ` Pythonとの一貫性を保つために、0ベースのインデックスを使用します。


インデックスとスライスを含む多次元配列

多次元配列でインデックスとスライスを使用する場合、PostgreSQLにはかなり難解な動作があります。 インデックスを使用して最終的な基になるデータに到達することは常に機能しますが、他のほとんどのスライスはデータベースレベルで奇妙に動作し、Djangoによって論理的で一貫した方法でサポートすることはできません。


CITextフィールド

class CIText(**options)

citext タイプに裏打ちされた大文字と小文字を区別しないテキストフィールドを作成するためのミックスイン。 使用する前に、パフォーマンスの考慮事項についてお読みください。

citextを使用するには、最初のCreateModel移行操作の前に、 CITextExtension 操作を使用してPostgreSQLでcitext拡張機能セットアップします。

CITextフィールドの ArrayField を使用している場合は、:setting: `INSTALLED_APPS`'django.contrib.postgres'を追加する必要があります。そうしないと、フィールド値が追加されます。 '{thoughts,django}'のような文字列として表示されます。

ミックスインを使用するいくつかのフィールドが提供されています。

class CICharField(**options)
class CIEmailField(**options)
class CITextField(**options)

これらのフィールドは、それぞれ CharFieldEmailField 、および TextField をサブクラス化します。

citextはPostgreSQLのtextタイプと同様に動作するため、max_lengthはデータベースに適用されません。

大文字と小文字を区別しない照合

PostgreSQL 12以降では、citext拡張機能の代わりに非決定論的照合を使用することをお勧めします。 CreateCollation 移行操作を使用してそれらを作成できます。 詳細については、移行を使用した照合の管理および非決定論的照合に関するPostgreSQLのドキュメントを参照してください。


HStoreField

class HStoreField(**options)

キーと値のペアを格納するためのフィールド。 使用されるPythonデータ型はdictです。 キーは文字列である必要があり、値は文字列またはnullのいずれかです(PythonではNone)。

このフィールドを使用するには、次のことを行う必要があります。

  1. :setting: `INSTALLED_APPS`'django.contrib.postgres'を追加します。

  2. PostgreSQLでhstore拡張機能をセットアップします。

最初のステップをスキップするとcan't adapt type 'dict'のようなエラーが表示され、2番目のステップをスキップすると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>]>

クエリするキーが別のルックアップの名前と衝突する場合は、代わりに:lookup: `hstorefield.contains` ルックアップを使用する必要があります。

警告

任意の文字列がhstore値のキーになる可能性があるため、以下にリストされているもの以外のルックアップはすべてキールックアップとして解釈されます。 エラーは発生しません。 入力ミスには特に注意し、クエリが意図したとおりに機能することを常に確認してください。


contains

:lookup: `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

これは、 :lookup: `含む ` ルックアップ-返されるオブジェクトは、オブジェクトのキーと値のペアが渡された値のサブセットであるオブジェクトになります。 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

class JSONField(encoder=None, **options)

JSONエンコードされたデータを格納するためのフィールド。 Pythonでは、データはPythonのネイティブ形式(辞書、リスト、文字列、数値、ブール値、None)で表されます。

encoder

標準のJSONシリアライザー(datetimeuuidなど)でサポートされていないデータ型をシリアル化するためのオプションのJSONエンコードクラス。 たとえば、 DjangoJSONEncoder クラスまたはその他のjson.JSONEncoderサブクラスを使用できます。

値がデータベースから取得されると、カスタムエンコーダーによって選択された形式(ほとんどの場合文字列)になるため、値を初期データ型()に戻すために追加の手順を実行する必要があります。 Model.from_db()Field.from_db_value()は、その目的のための2つの可能なフックです)。 デシリアライズでは、入力タイプを特定できないという事実を考慮する必要がある場合があります。 たとえば、実際にはdatetimeに選択されたのと同じ形式の文字列であるdatetimeを返すリスクがあります。

フィールドに default を指定する場合は、dict(空のデフォルトの場合)などの呼び出し可能オブジェクト、またはdict(関数など)を返す呼び出し可能オブジェクトであることを確認してください。 default={}を誤って使用すると、JSONFieldのすべてのインスタンス間で共有される可変のデフォルトが作成されます。

ノート

PostgreSQLには、jsonjsonbの2つのネイティブJSONベースのデータ型があります。 それらの主な違いは、保存方法とクエリ方法です。 PostgreSQLのjsonフィールドは、JSONの元の文字列表現として保存され、キーに基づいてクエリを実行するときにオンザフライでデコードする必要があります。 jsonbフィールドは、インデックス作成を可能にするJSONの実際の構造に基づいて保存されます。 トレードオフは、jsonbフィールドへの書き込みにかかるわずかな追加コストです。 JSONFieldjsonbを使用します。


バージョン3.1以降非推奨:代わりに django.db.models.JSONField を使用してください。


クエリJSONField

詳細については、 JSONFieldのクエリを参照してください。


範囲フィールド

PostgreSQLの組み込み範囲タイプに対応する5つの範囲フィールドタイプがあります。 これらのフィールドは、値の範囲を格納するために使用されます。 たとえば、イベントの開始タイムスタンプと終了タイムスタンプ、またはアクティビティが適している年齢の範囲。

すべての範囲フィールドは、Pythonでは psycopg2範囲オブジェクトに変換されますが、境界情報が必要ない場合は、入力としてタプルも受け入れます。 デフォルトは、下限が含まれ、上限が除外されます。つまり、[)です(異なる境界の詳細については、PostgreSQLのドキュメントを参照してください)。

IntegerRangeField

class IntegerRangeField(**options)

整数の範囲を格納します。 IntegerField に基づいています。 データベースではint4range、PythonではNumericRangeで表されます。

データを保存するときに指定された境界に関係なく、PostgreSQLは常に、下限を含み、上限を除外する標準形式の範囲、つまり[)を返します。


BigIntegerRangeField

class BigIntegerRangeField(**options)

大きな整数の範囲を格納します。 BigIntegerField に基づいています。 データベースではint8range、PythonではNumericRangeで表されます。

データを保存するときに指定された境界に関係なく、PostgreSQLは常に、下限を含み、上限を除外する標準形式の範囲、つまり[)を返します。


DecimalRangeField

class DecimalRangeField(**options)
浮動小数点値の範囲を格納します。 DecimalField に基づいています。 データベースではnumrange、PythonではNumericRangeで表されます。


DateTimeRangeField

class DateTimeRangeField(**options)
タイムスタンプの範囲を格納します。 DateTimeField に基づいています。 データベースではtstzrange、PythonではDateTimeTZRangeで表されます。


DateRangeField

class DateRangeField(**options)

日付の範囲を格納します。 DateField に基づいています。 データベースではdaterange、PythonではDateRangeで表されます。

データを保存するときに指定された境界に関係なく、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フィールドと同様に、SQL演算子@>、 [X156Xを使用して、containscontained_byoverlapの3つの標準包含演算子があります。 ]、および&&それぞれ。

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ルックアップは、範囲以外のフィールドタイプ( SmallAutoFieldAutoFieldBigAutoFieldSmallIntegerField )でも使用できます。 、 IntegerFieldBigIntegerFieldDecimalFieldFloatFieldDateField 、および 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>]>

バージョン3.1で変更: SmallAutoFieldAutoFieldBigAutoFieldSmallIntegerField 、および DecimalFieldのサポートを追加しました。


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

比較関数

範囲フィールドは、標準のルックアップをサポートします::lookup: `lt`:lookup:` gt`:lookup: `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

バージョン3.1の新機能。


渡されたブール値に応じて、包括的または排他的な下限を持つオブジェクトを返します。 BooleanField の有効なルックアップにチェーンできます。

>>> Event.objects.filter(ages__lower_inc=True)
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
lower_inf

バージョン3.1の新機能。


渡されたブール値に応じて、無制限(無限)または制限付きの下限を持つオブジェクトを返します。 BooleanField の有効なルックアップにチェーンできます。

>>> Event.objects.filter(ages__lower_inf=True)
<QuerySet []>
upper_inc

バージョン3.1の新機能。


渡されたブール値に応じて、包括的または排他的な上限を持つオブジェクトを返します。 BooleanField の有効なルックアップにチェーンできます。

>>> Event.objects.filter(ages__upper_inc=True)
<QuerySet []>
upper_inf

バージョン3.1の新機能。


渡されたブール値に応じて、無制限(無限)または制限付きの上限を持つオブジェクトを返します。 BooleanField の有効なルックアップにチェーンできます。

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

独自の範囲タイプを定義する

PostgreSQLでは、カスタム範囲タイプを定義できます。 Djangoのモデルとフォームフィールドの実装は以下の基本クラスを使用し、psycopg2はカスタム範囲タイプの使用を可能にするregister_range()を提供します。

class RangeField(**options)

モデル範囲フィールドの基本クラス。

base_field

使用するモデルフィールドクラス。

range_type

使用するpsycopg2範囲タイプ。

form_field

使用するフォームフィールドクラス。 django.contrib.postgres.forms.BaseRangeField のサブクラスである必要があります。

class django.contrib.postgres.forms.BaseRangeField

フォーム範囲フィールドの基本クラス。

base_field

使用するフォームフィールド。

range_type

使用するpsycopg2範囲タイプ。


範囲演算子

class 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のドキュメントを参照してください。