【 django 入門】Model と QuerySet について基礎を学ぶ

この記事では、DjangoにおけるModel とQuerySet について詳しく解説します。また、コードを交えて基礎的な使い方を紹介します。Model および QuerySet は Djangoアプリケーションでデータベースとの連携で重要なポイントとなるのでしっかり理解しましょう。

Modelクラスとは?

Djangoでは、Modelという概念があります。Modelは、データベースとのやり取りを行うためのオブジェクトです。つまり、データベースに保存されるデータを定義したものと言えます。

Modelの定義

Modelの定義は、以下のように行います。

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField()

上記の例では、MyModelというModelを定義しています。このModelは、nameとageという2つのフィールドを持っています。nameはCharFieldで、最大文字数は255文字です。ageはIntegerFieldで、整数値を保存します。

DjangoのModelには、様々なフィールドを使用してデータを定義することができます。それぞれのフィールドには、オプションがあり、フィールドの振る舞いをカスタマイズすることができます。

以下は、よく使用されるフィールドの一覧です。

CharField

CharFieldは、文字列を保存するためのフィールドで、最大文字数を指定することができます。オプションとして、max_lengthを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    name = models.CharField(max_length=20)

IntegerField

IntegerFieldは、整数を保存するためのフィールドです。オプションとして、defaultblanknullvalidatorsを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    age = models.IntegerField(default=0, blank=True, null=True)

FloatField

FloatFieldは、浮動小数点数を保存するためのフィールドです。オプションとして、defaultblanknullvalidatorsを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    rating = models.FloatField(default=0.0, blank=True, null=True)

BooleanField

BooleanFieldは、真偽値を保存するためのフィールドです。オプションとして、defaultblanknullを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    is_active = models.BooleanField(default=True, blank=True, null=True)

DateField

DateFieldは、日付を保存するためのフィールドです。オプションとして、auto_nowauto_now_adddefaultblanknullvalidatorsを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    date = models.DateField(auto_now_add=True, blank=True, null=True)

TimeField

TimeFieldは、時間を保存するためのフィールドです。オプションとして、auto_nowauto_now_adddefaultblanknullvalidatorsを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    time = models.TimeField(auto_now_add=True, blank=True, null=True)

DateTimeField

DateTimeFieldは、日時を保存するためのフィールドです。オプションとして、auto_nowauto_now_adddefaultblanknullvalidatorsを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    updated_at = models.DateTimeField(auto_now=True, blank=True, null=True)

上記の例では、auto_now_addauto_nowを使用して、作成日時と更新日時を自動的に設定するようにしています。

TextField

TextFieldは、長い文字列を保存するためのフィールドです。オプションとして、defaultblanknullvalidatorsを指定することができます。例えば、以下のように定義することができます。

class MyModel(models.Model):
    description = models.TextField(default="", blank=True, null=True)

これらのフィールドのオプションについては、Djangoの公式ドキュメントを参照してください。

Modelのマイグレーションについて

Djangoでは、Modelを定義した後に、そのModelをデータベースに反映させるために、マイグレーションを行います。マイグレーションとは、Modelの変更をデータベースに反映させる処理のことです。

マイグレーションを行うためには、以下の手順を実行します。

  1. makemigrationsコマンドを実行して、マイグレーションファイルを生成する
  2. migrateコマンドを実行して、マイグレーションファイルをデータベースに反映する

以下は、上記手順の具体的な例です。

  1. makemigrationsコマンドを実行して、マイグレーションファイルを生成する
$ python manage.py makemigrations

上記のコマンドを実行すると、マイグレーションファイルが生成されます。このマイグレーションファイルには、Modelの変更内容が記述されています。

  1. migrateコマンドを実行して、マイグレーションファイルをデータベースに反映する
$ python manage.py migrate

上記のコマンドを実行すると、マイグレーションファイルがデータベースに反映されます。この際、データベースにテーブルが存在しない場合は、テーブルが自動的に作成されます。

マイグレーションファイルは、複数の開発者が同じModelを編集している場合や、開発環境と本番環境のデータベース構造を同期させる場合にも便利です。また、マイグレーションファイルによって、データベースの変更履歴を管理することができ、必要に応じて過去の状態に戻すことができます。

QuerySet を使ったModel操作

DjangoにおけるModelには、QuerySetという概念があります。QuerySetは、データベースからデータを取得するためのオブジェクトであり、ORMを使用してデータを操作する際によく使われます。

以下は、QuerySetを使用してデータを取得する例です。

from myapp.models import MyModel

# MyModelの全てのレコードを取得する
records = MyModel.objects.all()

# nameが"John"のレコードを取得する
records = MyModel.objects.filter(name="John")

上記の例では、全てのレコードを取得するために、all()メソッドを使用しています。また、filter()メソッドを使用して、nameが"John"のレコードを取得しています。

QuerySetは、データベースから取得したデータをPythonオブジェクトとして扱うことができます。そのため、取得したデータを操作する際には、Pythonのリストや辞書型などと同様の方法で操作することができます。

例えば、以下のようにQuerySetから取得したデータをforループで処理することができます。

from myapp.models import MyModel

# MyModelの全てのレコードを取得する
records = MyModel.objects.all()

# 取得したレコードをforループで処理する
for record in records:
    print(record.name)

上記の例では、全てのレコードを取得して、nameを出力しています。

QuerySetでは、データの取得だけでなく、データの更新や削除も行うことができます。以下は、QuerySetを使用してデータを更新する例です。

from myapp.models import MyModel

# nameが"John"のレコードを取得する
records = MyModel.objects.filter(name="John")

# 取得したレコードのageを更新する
for record in records:
    record.age = 30
    record.save()

上記の例では、filter()メソッドを使用して、nameが"John"のレコードを取得しています。そして、取得したレコードのageを更新して、save()メソッドを使用してデータベースに保存しています。

QuerySetには、様々な便利なメソッドが用意されています。以下では、よく使われるメソッドを紹介します。

get()

get()メソッドは、条件に合致する単一のオブジェクトを取得します。条件に合致するオブジェクトが複数存在する場合は、MultipleObjectsReturned例外が発生します。条件に合致するオブジェクトが存在しない場合は、DoesNotExist例外が発生します。

例えば、idが1のレコードを取得する場合は、以下のように書きます。

from myapp.models import MyModel

# idが1のレコードを取得する
record = MyModel.objects.get(id=1)

exclude()

exclude()メソッドは、条件に合致しないオブジェクトを取得します。例えば、ageが20以下のレコードを取得する場合は、以下のように書きます。

from myapp.models import MyModel

# ageが20以下のレコードを取得する
records = MyModel.objects.exclude(age__lte=20)

order_by()

order_by()メソッドは、オブジェクトを指定したフィールドでソートします。複数のフィールドでソートすることもできます。例えば、ageでソートする場合は、以下のように書きます。

from myapp.models import MyModel

# ageでソートする
records = MyModel.objects.order_by('age')

複数のフィールドでソートする場合は、フィールド名をカンマ区切りで指定します。以下は、ageで昇順、idで降順にソートする例です。

from myapp.models import MyModel

# ageで昇順、idで降順にソートする
records = MyModel.objects.order_by('age', '-id')

count()

count()メソッドは、条件に合致するオブジェクトの件数を取得します。例えば、ageが20以上のレコードの件数を取得する場合は、以下のように書きます。

from myapp.models import MyModel

# ageが20以上のレコードの件数を取得する
count = MyModel.objects.filter(age__gte=20).count()

exists()

exists()メソッドは、条件に合致するオブジェクトが存在するかどうかを判定します。例えば、ageが20のレコードが存在するかどうかを判定する場合は、以下のように書きます。

from myapp.models import MyModel

# ageが20のレコードが存在するかどうかを判定する
exists = MyModel.objects.filter(age=20).exists()

values()

values()メソッドは、指定したフィールドの値を取得します。返り値は、辞書型オブジェクトのリストです。例えば、nameageの値を取得する場合は、以下のように書きます。

from myapp.models import MyModel

# nameとageの値を取得する
records = MyModel.objects.values('name', 'age')

values_list()

values_list()メソッドは、指定したフィールドの値をタプルで取得します。例えば、nameageの値をタプルで取得する場合は、以下のように書きます。

from myapp.models import MyModel

# nameとageの値をタプルで取得する
records = MyModel.objects.values_list('name', 'age')

以上が、QuerySetの他のよく使われるメソッドです。QuerySetには、これ以外にも多くのメソッドがありますので、Djangoの公式ドキュメントを参照してください。

QuerySet のサブクラスについて

DjangoのORMでは、QuerySetのサブクラスを作成することができます。サブクラスを作成することで、オリジナルのQuerySetに独自のメソッドを追加することができます。

QuerySetは、ORMで使用されるオブジェクトであり、データベースからデータを取得するためのインターフェースを提供します。QuerySetは、様々なメソッドを持っており、これらのメソッドを使用して、データのフィルタリング、ソート、集計などを行うことができます。しかし、QuerySetには、あなたが必要とするメソッドがない場合もあります。このような場合に、QuerySetのサブクラスを作成して、必要なメソッドを追加することができます。

サブクラスを作成する方法は、以下の通りです。

  1. QuerySetのサブクラスを定義する
  2. カスタムメソッドを追加する
  3. モデルにカスタムマネージャーを追加する

以下では、サブクラスの作り方について詳しく説明します。

QuerySet のサブクラスを定義する

サブクラスを定義するには、django.db.models.query.QuerySetを継承するクラスを作成します。以下は、サブクラスの例です。

from django.db.models.query import QuerySet

class MyQuerySet(QuerySet):
    pass

カスタムメソッドを追加する

サブクラスにカスタムメソッドを追加するには、通常のPythonクラスと同様に、メソッドを定義します。以下は、サブクラスにpublished()メソッドを追加する例です。

from django.db.models.query import QuerySet

class MyQuerySet(QuerySet):
    def published(self):
        return self.filter(status='published')

上記の例では、published()メソッドを追加しています。このメソッドは、statuspublishedのオブジェクトのみをフィルタリングして返します。

モデルにカスタムマネージャーを追加する

サブクラスを定義したら、それをモデルに追加することができます。モデルには、複数のマネージャーを追加することができます。マネージャーは、ORMでデータベースにアクセスするためのインターフェースです。

以下は、モデルにカスタムマネージャーを追加する例です。

from django.db import models
from myapp.querysets import MyQuerySet

class MyModelManager(models.Manager):
    def get_queryset(self):
        return MyQuerySet(self.model, using=self._db)

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    status = models.CharField(max_length=20)
    objects = models.Manager()
    my_manager = MyModelManager()

上記の例では、MyModelManagerという新しいマネージャーを追加しています。このマネージャーは、get_queryset()メソッドをオーバーライドして、MyQuerySetを返します。そして、MyModelには、通常のマネージャーとしてobjectsと、カスタムマネージャーとしてmy_managerを追加しています。

カスタムマネージャーを追加することで、モデルのクエリ操作に新しい機能を追加することができます。マネージャーは、モデルのクエリセットを返すため、新しいメソッドを追加することで、QuerySetに新しい機能を追加することができます。

QuerySetのサブクラスを使用することで、Django ORMをより柔軟にカスタマイズすることができます。

Udemy 独学でのアプリ開発に限界を感じたら

プログラミング初学者の皆さんに、 Udemy を強くお勧めしたいと思います。 Udemy は世界中のトップレベルのプログラミング講師が提供するオンライン講座を取り揃えています。以下は、 Udemy で学ぶことのメリットについての詳細です。

1. Udemy の豊富なコースの選択肢

Udemyには、数千ものコースがあります。初心者から上級者まで、プログラミングのあらゆるレベルを網羅しています。また、様々なプログラミング言語やツールに関するコースも多数あり、希望に合わせたコースを選ぶことができます。

2. 実践的な学習方法

Udemyのコースは、理論だけでなく実践的な学習も行えます。多くのコースには、プログラムの作成や実際のプロジェクトに取り組む演習が含まれています。これにより、理論だけでなく実践的なスキルも身につけることができます。

3. Udemy には質の高い講師陣

Udemyの講師陣には、世界中のトップレベルのプログラマーが多数在籍しています。彼らは、実務での経験を活かして、分かりやすい講義を行っています。

4. 初学者が始めるのにとても手頃な価格

Udemyのコースは、他のオンライン講座と比べて手頃な価格で提供されています。また、一度購入すると、終身アクセスが得られるので、自分のペースで学習することができます。

以上の理由から、プログラミング初学者の方には、Udemyが最適な学習プラットフォームであると考えられます。ぜひ一度、Udemyのコースを体験してみてください。


ウェブ開発の人気オンラインコース


ITとソフトウェアの人気オンラインコース


デザインの人気オンラインコース