Django 配列フィールド

Shubham Vora 2023年6月20日
  1. ArrayField を使用して Django モデルに 1 次元配列を追加する
  2. ArrayField を使用して Django モデルで多次元配列を作成する
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 をどのようにセットアップしたかを確認できます。

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

著者: Shubham Vora
Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub