Django 配列フィールド
Django の ArrayField は、Java、C、C++ などの他のプログラミング言語の配列データ構造に似ています。同じデータ型の複数の値を格納します。
Django で Arrayfield に進む前に、ユーザーは PostgreSQL をデータベースとして使用していることを確認する必要があります。これは、SQLite データベースが Arrayfield をサポートしていないためです。
PostgreSQL データベースをセットアップするには、ユーザーは PostgreSQL のサーバーをローカルで実行する必要があります。 その後、Django に接続するには、アプリケーションの settings.py ファイルで、以下に示すように DATABASES 配列を変更する必要があります。
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "<DATABASES_name>",
"USER": "<USER_name>",
"PASSWORD": "<PASSWORD_of_user>",
"HOST": "localhost",
"PORT": "5432",
}
}
下の画像では、ユーザーは settings.py ファイルで PostgreSQL をどのようにセットアップしたかを確認できます。

ArrayField を使用して Django モデルに 1 次元配列を追加する
このセクションでは、ArrayField を使用して値の配列を Django モデルに追加します。 以下の例は、ArrayField を使用して TextField の配列を作成する方法を示しています。
from django.db import models
from django.contrib.postgres.fields import ArrayField
class ResearchPaper(models.Model):
paperName = models.CharField(max_length=200)
author = ArrayField(models.CharField(max_length=200), blank=True)
def __str__(self):
return self.paperName
上記の Python コードで ResearchPaper の Django モデルを作成しました。 paperName および Authors フィールドが含まれています。
paperName フィールドは通常の文字フィールドですが、1つの論文に複数の著者が存在する可能性があるため、ArrayField を使用して Authors フィールドを作成しました。
models.py ファイルにモデルを追加したら、モデルを登録する必要があります。 モデルを登録するには、admin.py が存在しない場合は作成し、以下のコードをファイルに追加します。
from .models import ResearchPaper
admin.site.register(ResearchPaper)
モデルを登録した後、ユーザーはモデルをデータベースに移行する必要があります。 そのためには、ユーザーはターミナルで次のコマンドを 1つずつ実行する必要があります。
python manage.py makemigrations <app_name>
python manage.py migrate
次に、その値に従って ArrayField からデータをクエリする方法を学習します。
ResearchPaper テーブルのデータのクエリを開始する前に、いくつかのデータを追加しましょう。
ResearchPaper.objects.create(paperName="First paper", author=["Alice", "Bob", "jenny"])
ResearchPaper.objects.create(paperName="Second paper", author=["Alice"])
ResearchPaper.objects.create(paperName="Third paper", author=["Bob"])
ResearchPaper.objects.create(paperName="Fourth paper", author=["Alice", "Bob"])
ResearchPaper.objects.create(paperName="Fifth paper", author=["Bob", "jenny"])
そのため、異なる著者による研究論文のレコードをいくつか追加しました。 また、複数の著者がいる論文もあれば、1 人の著者が複数の論文を書いているものもあります。
以下のgifでは、データがデータベースに追加されていることがわかります。

contains ルックアップを使用する
contains ルックアップは、ルックアップ値が ArrayField データのサブセットであるすべてのレコードを返します。
コード例:
ResearchPaper.objects.filter(
author__contains=["Alice"]
) # returns <QuerySet [<ResearchPaper: First paper>, <ResearchPaper: Second paper>, <ResearchPaper: Fourth paper>]>
ResearchPaper.objects.filter(
author__contains=["Alice", "Bob"]
) # returns <QuerySet [<ResearchPaper: First paper>, <ResearchPaper: Fourth paper>
出力:

contained_by ルックアップを使用
contained_by ルックアップは、contains ルックアップの逆です。 データがルックアップ値のサブセットであるすべてのレコードを返します。
コード例:
ResearchPaper.objects.filter(
author__contained_by=["Alice"]
) # returns <QuerySet [<ResearchPaper: Second paper>]>
ResearchPaper.objects.filter(
author__contained_by=["Alice", "Bob"]
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Third paper>, <ResearchPaper: Fourth paper>]>
出力:

overlap ルックアップを使用
overlap ルックアップは、単一または複数のルックアップ値をデータに含むすべてのレコードを返します。
コード例:
ResearchPaper.objects.filter(
author__overlap=["Alice"]
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Fourth paper>]>
ResearchPaper.objects.filter(
author__overlap=["Alice", "jenny"]
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Fourth paper>, <ResearchPaper: Fifth paper>]>
出力:

lenルックアップを使用
len ルックアップはデータの長さをチェックし、長さが len ルックアップの値と等しいすべてのレコードを返します。
コード例:
ResearchPaper.objects.filter(
author__len=1
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Third paper>]>
ResearchPaper.objects.filter(
author__len=3
) # returns <QuerySet [<ResearchPaper: First paper>]>
出力:

このように、さまざまなルックアップを使用して、ArrayField 値に従ってレコードをクエリできます。
ArrayField を使用して Django モデルで多次元配列を作成する
ユーザーは Django モデルで 2 次元配列を作成する必要がある場合があり、ユーザーは ArrayField を使用してそれを実現できます。 ここでは、Django で 2 次元配列を作成するための基本的なコードを記述しました。
from django.db import models
from django.contrib.postgres.fields import ArrayField
class ResearchPaper(models.Model):
paperName = models.TextField()
Authors = ArrayField(
ArrayField(
models.TextField(blank=True),
)
)
この記事では、Django フィールドで 1 次元および多次元の配列を作成する方法を学びました。 また、ArrayField の値に従ってレコードをクエリするために、さまざまなルックアップを使用することも学びました。
ユーザーは、1 次元配列のように 2 次元配列のレコードをクエリできます。
