PostgreSQL固有のモデルフィールド—Djangoドキュメント
PostgreSQL固有のモデルフィールド
これらのフィールドはすべて、django.contrib.postgres.fields
モジュールから利用できます。
これらのフィールドのインデックス作成
Index と Field.db_index はどちらもBツリーインデックスを作成します。これは、複雑なデータ型をクエリする場合には特に役立ちません。 GinIndex や GistIndex などのインデックスの方が適していますが、インデックスの選択は使用しているクエリによって異なります。 一般に、GiSTは範囲フィールドおよび HStoreField に適している可能性があり、GINは ArrayField に役立つ可能性があります。
ArrayField
- class ArrayField(base_field, size=None, **options)
データのリストを格納するためのフィールド。 ほとんどのフィールドタイプを使用でき、別のフィールドインスタンスを base_field として渡します。 サイズを指定することもできます。
ArrayField
は、多次元配列を格納するためにネストできます。フィールドに 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
: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)
これらのフィールドは、それぞれ CharField 、 EmailField 、および TextField をサブクラス化します。
citext
はPostgreSQLのtext
タイプと同様に動作するため、max_length
はデータベースに適用されません。
大文字と小文字を区別しない照合
PostgreSQL 12以降では、citext
拡張機能の代わりに非決定論的照合を使用することをお勧めします。 CreateCollation 移行操作を使用してそれらを作成できます。 詳細については、移行を使用した照合の管理および非決定論的照合に関するPostgreSQLのドキュメントを参照してください。
HStoreField
- class HStoreField(**options)
キーと値のペアを格納するためのフィールド。 使用されるPythonデータ型は
dict
です。 キーは文字列である必要があり、値は文字列またはnullのいずれかです(PythonではNone
)。このフィールドを使用するには、次のことを行う必要があります。
:setting: `INSTALLED_APPS` に
'django.contrib.postgres'
を追加します。PostgreSQLでhstore拡張機能をセットアップします。
最初のステップをスキップすると
can't adapt type 'dict'
のようなエラーが表示され、2番目のステップをスキップするとtype "hstore" does not exist
のようなエラーが表示されます。
クエリ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` ルックアップを使用する必要があります。
ノート
キー変換は、:lookup: `contains` 、:lookup:` icontains` 、:lookup: `endswith` 、と連鎖させることもできます。 :lookup: `iendswith` 、:lookup:` iexact` 、:lookup: `regex` 、:lookup:` iregex` 、[ X239X]:lookup: `startswith` 、および:lookup:` istartswith` ルックアップ。
警告
任意の文字列が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シリアライザー(
datetime
、uuid
など)でサポートされていないデータ型をシリアル化するためのオプションのJSONエンコードクラス。 たとえば、 DjangoJSONEncoder クラスまたはその他のjson.JSONEncoder
サブクラスを使用できます。値がデータベースから取得されると、カスタムエンコーダーによって選択された形式(ほとんどの場合文字列)になるため、値を初期データ型()に戻すために追加の手順を実行する必要があります。 Model.from_db()と Field.from_db_value()は、その目的のための2つの可能なフックです)。 デシリアライズでは、入力タイプを特定できないという事実を考慮する必要がある場合があります。 たとえば、実際には
datetime
に選択されたのと同じ形式の文字列であるdatetime
を返すリスクがあります。
フィールドに default を指定する場合は、
dict
(空のデフォルトの場合)などの呼び出し可能オブジェクト、またはdict(関数など)を返す呼び出し可能オブジェクトであることを確認してください。default={}
を誤って使用すると、JSONField
のすべてのインスタンス間で共有される可変のデフォルトが作成されます。
ノート
PostgreSQLには、json
とjsonb
の2つのネイティブJSONベースのデータ型があります。 それらの主な違いは、保存方法とクエリ方法です。 PostgreSQLのjson
フィールドは、JSONの元の文字列表現として保存され、キーに基づいてクエリを実行するときにオンザフライでデコードする必要があります。 jsonb
フィールドは、インデックス作成を可能にするJSONの実際の構造に基づいて保存されます。 トレードオフは、jsonb
フィールドへの書き込みにかかるわずかな追加コストです。 JSONField
はjsonb
を使用します。
バージョン3.1以降非推奨:代わりに django.db.models.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を使用して、contains
、contained_by
、overlap
の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
ルックアップは、範囲以外のフィールドタイプ( 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>]>
バージョン3.1で変更: SmallAutoField 、 AutoField 、 BigAutoField 、 SmallIntegerField 、および 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のドキュメントを参照してください。