サーチ…


構文

  • 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])


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow