HOWTO · Django

Django 配列フィールド

この記事では、Django データベース モデル内で ArrayFields を使用する方法を学習します。

このページの内容

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 をどのようにセットアップしたかを確認できます。

django セットアップ 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では、データがデータベースに追加されていることがわかります。

django arrayfield add data

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>

出力:

django arrayfield contains

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

出力:

django 配列フィールドを含む_by

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

出力:

django 配列フィールドのオーバーラップ

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

出力:

django arrayfield len

このように、さまざまなルックアップを使用して、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 次元配列のレコードをクエリできます。