PostgreSQL固有のモデルフィールド—Djangoドキュメント
PostgreSQL固有のモデルフィールド
これらのフィールドはすべて、django.contrib.postgres.fields
モジュールから利用できます。
これらのフィールドのインデックス作成
Index と Field.db_index はどちらもBツリーインデックスを作成します。これは、複雑なデータ型をクエリする場合には特に役立ちません。 GinIndex や GistIndex などのインデックスの方が適していますが、インデックスの選択は使用しているクエリによって異なります。 一般に、GiSTは範囲フィールドおよび HStoreField に適している可能性があり、GINは ArrayField および JSONField に役立つ可能性があります。
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
として指定できます。 例えば:データベースとモデル間の値の変換、データと構成の検証、およびシリアル化はすべて、基になる基本フィールドに委任されます。
- size
これはオプションの引数です。
渡された場合、配列は指定された最大サイズになります。 これはデータベースに渡されますが、現在PostgreSQLは制限を強制していません。
ノート
ArrayField
をネストする場合、 size パラメーターを使用するかどうかに関係なく、PostgreSQLでは配列が長方形である必要があります。
不規則な形状が必要な場合は、基になるフィールドをnull許容にし、値にNone
を埋め込む必要があります。
クエリArrayField
ArrayField には多数のカスタムルックアップと変換があります。 次のモデル例を使用します。
contains
:lookup: `contains` ルックアップは ArrayField でオーバーライドされます。 返されるオブジェクトは、渡された値がデータのサブセットであるオブジェクトになります。 SQL演算子@>
を使用します。 例えば:
contained_by
これは、 :lookup: `含む ` ルックアップ-返されるオブジェクトは、データが渡された値のサブセットであるオブジェクトになります。 SQL演算子<@
を使用します。 例えば:
overlap
データが渡された値と結果を共有するオブジェクトを返します。 SQL演算子&&
を使用します。 例えば:
インデックス変換
Indexは、インデックスを配列に変換します。 負でない整数はすべて使用できます。 配列のサイズを超えてもエラーはありません。 変換後に使用できるルックアップは、 base_field からのものです。 例えば:
ノート
PostgreSQLは、生のSQLを作成するときに、配列フィールドに1ベースのインデックスを使用します。 ただし、これらのインデックスとで使用されるインデックス :lookup: `スライス ` Pythonとの一貫性を保つために、0ベースのインデックスを使用します。
スライス変換
スライス変換は、配列のスライスを取得します。 1つのアンダースコアで区切って、任意の2つの非負の整数を使用できます。 変換後に使用可能なルックアップは変更されません。 例えば:
ノート
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
はデータベースに適用されません。
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
で使用できるカスタムルックアップがいくつかあります。
次のモデル例を使用します。
キールックアップ
特定のキーに基づいてクエリを実行するには、そのキーをルックアップ名として使用するだけです。
キールックアップの後に他のルックアップをチェーンできます。
クエリするキーが別のルックアップの名前と衝突する場合は、代わりに:lookup: `hstorefield.contains` ルックアップを使用する必要があります。
警告
任意の文字列がhstore値のキーになる可能性があるため、以下にリストされているもの以外のルックアップはすべてキールックアップとして解釈されます。 エラーは発生しません。 入力ミスには特に注意し、クエリが意図したとおりに機能することを常に確認してください。
contains
:lookup: `contains` ルックアップは HStoreField でオーバーライドされます。 返されるオブジェクトは、指定されたdict
のキーと値のペアがすべてフィールドに含まれているオブジェクトです。 SQL演算子@>
を使用します。 例えば:
contained_by
これは、 :lookup: `含む ` ルックアップ-返されるオブジェクトは、オブジェクトのキーと値のペアが渡された値のサブセットであるオブジェクトになります。 SQL演算子<@
を使用します。 例えば:
has_key
指定されたキーがデータ内にあるオブジェクトを返します。 SQL演算子?
を使用します。 例えば:
has_any_keys
指定されたキーのいずれかがデータ内にあるオブジェクトを返します。 SQL演算子?|
を使用します。 例えば:
has_keys
指定されたすべてのキーがデータ内にあるオブジェクトを返します。 SQL演算子?&
を使用します。 例えば:
keys
キーの配列が指定された値であるオブジェクトを返します。 順序の信頼性は保証されていないため、この変換は主に ArrayField のルックアップと組み合わせて使用する場合に役立ちます。 SQL関数akeys()
を使用します。 例えば:
values
値の配列が指定された値であるオブジェクトを返します。 順序の信頼性は保証されていないため、この変換は主に ArrayField のルックアップと組み合わせて使用する場合に役立ちます。 SQL関数avalues()
を使用します。 例えば:
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
を使用します。
クエリJSONField
次のモデル例を使用します。
キー、インデックス、およびパスのルックアップ
特定の辞書キーに基づいてクエリを実行するには、そのキーをルックアップ名として使用します。
複数のキーをチェーンして、パスルックアップを形成できます。
キーが整数の場合、配列内のインデックスルックアップとして解釈されます。
クエリするキーが別のルックアップの名前と衝突する場合は、代わりに:lookup: `jsonfield.contains` ルックアップを使用してください。
キーまたはインデックスが1つだけ使用される場合は、SQL演算子->
が使用されます。 複数の演算子を使用する場合は、#>
演算子が使用されます。
JSONデータでnull
をクエリするには、値としてNone
を使用します。
欠落しているキーを照会するには、isnull
ルックアップを使用します。
バージョン2.1で変更:古いバージョンでは、ルックアップ値としてNone
を使用すると、None
のキーを持つオブジェクトではなく、キーのないオブジェクトに一致します。価値。
警告
任意の文字列がJSONオブジェクトのキーになる可能性があるため、以下にリストされているもの以外のルックアップはキールックアップとして解釈されます。 エラーは発生しません。 入力ミスには特に注意し、クエリが意図したとおりに機能することを常に確認してください。
封じ込めと主要な操作
JSONField は、封じ込めとキーに関連するルックアップを HStoreField と共有します。
- :lookup: `含む ` (文字列の辞書だけでなく、任意のJSONを受け入れます)
- :lookup: `contained_by ` (文字列の辞書だけでなく、任意のJSONを受け入れます)
- :lookup: `has_key `
- :lookup: `has_any_keys `
- :lookup: `has_keys `
範囲フィールド
PostgreSQLの組み込み範囲タイプに対応する5つの範囲フィールドタイプがあります。 これらのフィールドは、値の範囲を格納するために使用されます。 たとえば、イベントの開始タイムスタンプと終了タイムスタンプ、またはアクティビティが適している年齢の範囲。
すべての範囲フィールドは、Pythonでは psycopg2範囲オブジェクトに変換されますが、境界情報が必要ない場合は、入力としてタプルも受け入れます。 デフォルトは、下限が含まれ、上限が除外されます。 つまり、[)
です。
IntegerRangeField
- class IntegerRangeField(**options)
整数の範囲を格納します。 IntegerField に基づいています。 データベースでは
int4range
、PythonではNumericRange
で表されます。データを保存するときに指定された境界に関係なく、PostgreSQLは常に、下限を含み、上限を除外する標準形式の範囲を返します。 つまり、
[)
です。
BigIntegerRangeField
- class BigIntegerRangeField(**options)
大きな整数の範囲を格納します。 BigIntegerField に基づいています。 データベースでは
int8range
、PythonではNumericRange
で表されます。データを保存するときに指定された境界に関係なく、PostgreSQLは常に、下限を含み、上限を除外する標準形式の範囲を返します。 つまり、
[)
です。
DecimalRangeField
- class DecimalRangeField(**options)
バージョン2.2の新機能。
浮動小数点値の範囲を格納します。 DecimalField に基づいています。 データベースでは
numrange
、PythonではNumericRange
で表されます。
FloatRangeField
- class FloatRangeField(**options)
浮動小数点値の範囲を格納します。 FloatField に基づいています。 データベースでは
numrange
、PythonではNumericRange
で表されます。バージョン2.2以降非推奨:代わりに DecimalRangeField を使用してください。
DateTimeRangeField
- class DateTimeRangeField(**options)
- タイムスタンプの範囲を格納します。 DateTimeField に基づいています。 データベースでは
tstzrange
、PythonではDateTimeTZRange
で表されます。
DateRangeField
- class DateRangeField(**options)
日付の範囲を格納します。 DateField に基づいています。 データベースでは
daterange
、PythonではDateRange
で表されます。データを保存するときに指定された境界に関係なく、PostgreSQLは常に、下限を含み、上限を除外する標準形式の範囲を返します。 つまり、
[)
です。
範囲フィールドのクエリ
範囲フィールドには、いくつかのカスタムルックアップと変換があります。 これらは上記のすべてのフィールドで使用できますが、次のモデル例を使用します。
次のサンプルオブジェクトも使用します。
およびNumericRange
:
封じ込め機能
他のPostgreSQLフィールドと同様に、SQL演算子@>
、 [X156Xを使用して、contains
、contained_by
、overlap
の3つの標準包含演算子があります。 ]、および&&
それぞれ。
contains
contained_by
contained_by
ルックアップは、範囲以外のフィールドタイプ( IntegerField 、 BigIntegerField 、 FloatField 、 DateField )でも使用できます。 、および DateTimeField 。 例えば:
overlap
比較関数
範囲フィールドは、標準のルックアップをサポートします::lookup: `lt` 、:lookup:` gt` 、:lookup: `lte` および:ルックアップ: `gte` 。 これらは特に役に立ちません。必要な場合にのみ、最初に下限を比較し、次に上限を比較します。 これは、範囲フィールドによる順序付けに使用される戦略でもあります。 特定の範囲比較演算子を使用することをお勧めします。
fully_lt
返される範囲は、渡された範囲よりも厳密に小さくなります。 つまり、返される範囲内のすべてのポイントは、渡された範囲内のすべてのポイントよりも少なくなります。
fully_gt
返される範囲は、渡された範囲よりも厳密に大きくなります。 つまり、返される範囲内のすべてのポイントは、渡された範囲内のすべてのポイントよりも大きくなります。
not_lt
返される範囲には、渡された範囲よりも小さいポイントは含まれません。つまり、返される範囲の下限は、少なくとも渡された範囲の下限です。
not_gt
返される範囲には、渡された範囲よりも大きいポイントは含まれません。つまり、返される範囲の上限は、多くても渡された範囲の上限です。
adjacent_to
返される範囲は、渡された範囲と境界を共有します。
境界を使用したクエリ
クエリで使用できる3つの変換があります。 下限または上限を抽出するか、空に基づいてクエリを実行できます。
startswith
返されるオブジェクトには、指定された下限があります。 ベースフィールドの有効なルックアップにチェーンできます。
endswith
返されるオブジェクトには、指定された上限があります。 ベースフィールドの有効なルックアップにチェーンできます。
独自の範囲タイプを定義する
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範囲タイプ。