Django
ArrayField - PostgreSQL固有のフィールド
サーチ…
構文
- from django.contrib.postgres.fields import ArrayField
- クラスArrayField(base_field、size = None、** options)
- FooModel.objects.filter(array_field_name__contains = [オブジェクト、to、check])
- FooModel.objects.filter(array_field_name__contained_by = [オブジェクト、to、check])
備考
size
パラメータはPostgreSQLに渡されますが、PostgreSQLはそれを強制しません。
ArrayField
を使用する場合は、 Postgresql配列のドキュメントからこの警告を覚えておいてください。
ヒント:配列はセットではありません。特定の配列要素を検索することは、データベースの誤った設計の兆候となります。配列要素となるアイテムごとに行を持つ別のテーブルを使用することを検討してください。これは検索が容易になり、多数の要素に対してよりスケーラビリティが向上します。
基本的なArrayField
PostgreSQL ArrayFieldを作成するには、ArrayFieldに、最初の引数としてフィールドとして格納するデータ型を渡す必要があります。書籍の評価を保存するので、 FloatField
を使用しFloatField
。
from django.db import models, FloatField
from django.contrib.postgres.fields import ArrayField
class Book(models.Model):
ratings = ArrayField(FloatField())
ArrayFieldの最大サイズの指定
from django.db import models, IntegerField
from django.contrib.postgres.fields import ArrayField
class IceCream(models.Model):
scoops = ArrayField(IntegerField() # we'll use numbers to ID the scoops
, size=6) # our parlor only lets you have 6 scoops
sizeパラメータを使用すると、それはpostgresqlに渡され、それを受け入れて無視します。したがって、postgresqlコンソールを使用して上記のscoops
フィールドに7つの整数を追加することは可能です。
containsを含むArrayFieldのメンバシップのクエリ
このクエリは、チョコレートスクープとバニラスクープを持つすべてのコーンを返します。
VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4 # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])
models.py
ファイルからIceCream
モデルをインポートすることを忘れないでください。
また、djangoはArrayField
のインデックスを作成しないことにArrayField
。それらを検索する場合は、インデックスが必要になります。このインデックスは、移行ファイルでRunSQLを呼び出すことで手動で作成する必要があります。
ArrayFieldのネスト
あなたは巣ができArrayField
別渡すことによって、SをArrayField
それがだとしてbase_field
。
from django.db import models, IntegerField
from django.contrib.postgres.fields import ArrayField
class SudokuBoard(models.Model):
numbers = ArrayField(
ArrayField(
models.IntegerField(),
size=9,
),
size=9,
)
contained_byを含むリスト内の項目を含むすべてのモデルを照会する
このクエリは、ミントスクープまたはバニラスクープのいずれかを持つすべてのコーンを返します。
minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])