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 次元配列のレコードをクエリできます。