IT技術早わかりくん

生成AIアプリ開発とIT分野の記事を発信します。

Djangoのモデルのフィールドについて徹底解説!

 


モデルにおいて最も重要な箇所であり -- モデルにおいて唯一必須となっている箇所 -- それはそのモデルが定義するデータベースのフィールドの一覧です。フィールドはクラスの属性として定義されます。clean、save あるいは delete のようなフィールド名は、モデル API で利用されていて衝突してしまうため、選べないことに注意してください。

フィールド名にできないものもある

cleansavedeleteなどのフィールド名は、Djangoのモデルが既に内部的に使用しているメソッド名と衝突してしまうため、フィールド名として使用することはできません。

これらの名前をフィールド名に使ってしまうと、モデルの機能に干渉してしまい、予期しない動作を引き起こす可能性があります。

したがって、フィールド名を決める際は、以下のようなDjangoで使用されている名前は避けるべきです:

 

  • clean
  • save
  • delete
  • get_absolute_url
  • get_next_by_FOO
  • get_previous_by_FOO
  • get_FOO_display

これら以外にも、Python予約語(class, def, importなど)もフィールド名には使えません。

フィールド名は分かりやすく、モデルの属性を表す名前を付けるのが良いです。例えば、title, content, author, created_atなどです。衝突を避けるために、少し長めの名前を付けるのも一つの方法です。

実装例

from django.db import models

class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

モデル内の各フィールドの型について

Django モデルの基本型

Django フレームワークでは、モデルを定義することで、データベースにデータを保存することができます。モデルは、Python のクラスとして定義され、各フィールドはクラスの属性として表現されています。 今回の例では、`Musician` モデルと `Album` モデルが定義されています。`Musician` モデルには、`first_name`、`last_name`、`instrument` の3つのフィールドが定義されています。一方、`Album` モデルには、`artist`、`name`、`release_date`、`num_stars` の4つのフィールドが定義されています。

文字列型: `CharField`

`CharField` は、文字列型のフィールドを定義するために使用されます。`max_length` パラメータで、フィールドの最大長を指定することができます。今回の例では、`first_name`、`last_name`、`instrument`、`name` がこの型を使用しています。

日付型: `DateField`

`DateField` は、日付型のフィールドを定義するために使用されます。`release_date` フィールドがこの型を使用しています。

整数型: `IntegerField`

`IntegerField` は、整数型のフィールドを定義するために使用されます。今回の例では、`num_stars` フィールドがこの型を使用しています。

外部キー: `ForeignKey`

`ForeignKey` は、別のモデルへの外部キー参照を定義するために使用されます。`Album` モデルの `artist` フィールドがこの型を使用しており、`Musician` モデルを参照しています。

DjangoのForeignKeyによるリレーショナルデータモデリング

DjangoのForeignKey

DjangoのForeignKeyは、リレーショナルデータベースにおける外部キー制約を表現するためのフィールドです。これにより、あるモデルから別のモデルへの一対多のリレーションシップを定義することができます。

定義方法

ForeignKeyは、リレーションシップの「多」側のモデルで定義します。その構文は `ForeignKey(to, on_delete, **options)` です。`to`にはリレーションシップの「一」側のモデルを指定し、`on_delete`には参照先のオブジェクトが削除された場合の動作を設定します。その他のオプションとして、`related_name`、`related_query_name`、`limit_choices_to`などが使用できます。

 

ForeignKeyの使い方

on_deleteの設定

`on_delete`には以下のような動作を指定できます: - `CASCADE`: 参照先のオブジェクトが削除されると、それを参照しているオブジェクトも一緒に削除される - `PROTECT`: 参照先のオブジェクトが削除されようとすると、ProtectedErrorを発生させて削除を防ぐ - `SET_NULL`: 参照先のオブジェクトが削除されると、外部キーの値がNULLに設定される - `SET_DEFAULT`: 参照先のオブジェクトが削除されると、外部キーの値がデフォルト値に設定される - `SET()`: 参照先のオブジェクトが削除されると、外部キーの値が指定された値または関数の戻り値に設定される - `DO_NOTHING`: 参照先のオブジェクトが削除されても何も行動しない

逆参照

ForeignKeyを定義したモデルから、リレーションシップの「一」側のモデルへアクセスするには、デフォルトで `FOO_set` という属性を使用します。ここで `FOO` は「多」側のモデル名の小文字です。`related_name`オプションを使用すれば、この属性名を変更できます。

データベース上での表現

DjangoのForeignKeyは、データベース上では外部キー制約として表現されます。マイグレーションを実行することで、この制約がデータベースに反映されます。

 



このように、Django のモデル定義では、様々な型のフィールドを組み合わせて、必要なデータ構造を表現することができます。これにより、アプリケーションに必要なデータを柔軟に管理することができます。