Django のモデル
モデルは、すべての ORM の中核になります。 モデルは、アプリケーションで使用されるデータの一部を表現したものです。 これには、ユーザー、製品、カテゴリ、またはアプリケーションで必要とするその他の形式のデータがあります。
モデルを作成する
Django では、モデルは django.models.Model
の機能のコレクションを継承する任意のクラスです。 コレクションには、データベースに対してクエリを実行したり、新しいエントリを作成したり、更新を保存したりできるメソッドが含まれています。 また、フィールドを定義し、メタデータを設定し、モデル間のリレーションシップを確立することもできます。
Product
と Category
という 2 つのモデルを作成する場合は、次の 2 つのクラスを追加します。
from django.db import models
class Product(models.Model):
# details would go here
pass
class Category(models.Model):
# details would go here
pass
メソッドを追加する
モデルのデータを構成する方法について説明する前に、モデルが Python クラスであるという事実を強調することが重要です。 その結果、メソッドを追加したり、Django.models.Model
に用意されているメソッドや、すべての Python オブジェクトに固有のメソッドをオーバーライドしたりすることができます。
特に強調すべきメソッドの 1 つは __str__
です。 フィールドが指定されていない場合は、このメソッドを使用してオブジェクトを表示します。 Product
に name
フィールド (すぐに表示される) がある場合は、__str__
をオーバーライドすると、そのフィールドを Product
の既定の文字列表現として返すことができます。
class Product(models.Model):
name = models.TextField()
def __str__(self):
return self.name
フィールドを追加する
フィールドでは、モデルのデータ構造を定義します。 フィールドには、項目の名前、作成日、価格、またはモデルに格納する必要があるその他の部分のデータが含まれます。
データの部分ごとに、そのデータ型、検証規則、その他の形式のメタデータが異なります。 Django ORM には、モデルのフィールドを仕様に合わせて構成するための豊富なオプション スイートが用意されています。 ORM は拡張可能であるため、必要に応じて独自の規則を作成できます。
フィールドの種類の定義
すべてのフィールドのメタデータの主要部分は、文字列や数値など、格納されるデータの種類です。 フィールド型は、データベース型と HTML フォーム コントロール型 (テキスト ボックスやチェック ボックスなど) の両方にマップされます。 Django には、フィールドの種類がいくつか含まれています。次のようなものがあります。
CharField
: 1 行のテキスト。TextField
: 複数行のテキスト。BooleanField
: ブール値の true/false オプション。DateField
: 日付。TimeField
: 時刻。DateTimeField
: 日付と時刻。URLField
: URL。IntegerField
: 整数。DecimalField
: 固定精度小数点数。
Product
および Category
クラスにフィールドを追加するには、次のようなコードがある場合があります。
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
class Category(models.Model):
name = models.TextField()
フィールド オプション
フィールド オプションを使用して、null または空白の値を許可するメタデータを追加したり、フィールドを一意としてマークしたりすることができます。 検証オプションを設定し、検証エラーのカスタム メッセージを指定することもできます。
フィールドの種類と同様に、フィールド オプションはデータベース内の適切な設定にマップされます。 規則は、Django によって自動的に生成されるすべての形式で適用されます。
フィールド オプションは、フィールド自体の関数に渡されます。 フィールドごとに異なるオプションがサポートされる場合があります。 最も一般的なものをいくつか示します。
null
- null 値を許可するブール値のオプション。
- 既定値は
False
です。
blank
- 空白の値を許可するブール値のオプション。
- 既定値は
False
です。
default
- フィールドの値が指定されていない場合に、既定値の構成を許可します。
- 既定値をデータベース
null
に設定する場合は、default
をNone
に設定します。
unique
- このフィールドには一意の値を含める必要があります。
- 既定値は
False
です。
min_length
とmax_length
- 文字列の最小と最大の長さを示すために、文字列型と共に使用されます。
- 既定値は
None
です。
min_value
とmax_value
- 最小と最大の値を示すために、数値型と共に使用されます。
auto_now
およびauto_now_add
。- 現在の時刻を使用する必要があるかどうかを示すために、日付/時刻型と共に使用されます。
auto_now
では "常" に、保存時にフィールドが現在の時刻に設定されます。これはlast_update
フィールドで便利です。auto_now_add
では、作成時にフィールドが現在の時刻に設定されます。これはcreation_date
フィールドで便利です。
Note
値 null
と blank
は似ているように見えますが、データベース用語では異なることを意味します。 null
は値が不足しているのに対し、blank
は厳密に言えば空の値です。
モデルにオプションを追加する場合、コードは次のようになります。
from django.db import models
class Product(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
price = models.DecimalField(min_value=0.99, max_value=1000)
creation_date = models.DateField(auto_now_add=True)
class Category(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
クラスとリレーションシップ
通常、リレーショナル データベースでは、テーブルの各行に主キー (通常、自動的に増分される整数) を指定します。 Django の ORM では、id
という名前のフィールドを追加して、作成するすべてのモデルにこのキーが自動的に追加されます。
この動作をオーバーライドする場合は、主キーにするフィールドを設定できます。 ただし、ほとんどの状況では、Django の id
フィールドに依存する必要があります。
リレーショナル データベースには、テーブルの間のリレーションシップもあります。 製品にはカテゴリがあり、従業員には責任者があり、車には製造元があります。 Django の ORM では、モデル間で作成するすべてのリレーションシップがサポートされます。
最も一般的なリレーションシップは "一対多" です。これは、厳密には "外部キー リレーションシップ" と呼ばれています。 外部キー リレーションシップでは、複数の項目が 1 つの属性を共有します。 たとえば、複数の製品が 1 つのカテゴリに分類されます。 このリレーションシップをモデル化するには、ForeignKey
フィールドを使用します。
リレーションシップを作成するには、子オブジェクトに ForeignKey
フィールドを追加します。 製品がカテゴリ別にグループ化されている場合は、category
プロパティを Product
クラスに追加し、型を ForeignKey
に設定します。
Django では、<child>_set
というすべての子へのアクセスを提供するために、プロパティを自動的に親に追加します。ここで、<child>
は子オブジェクトの名前です。 例の Category
では、カテゴリ内のすべての製品へのアクセスを提供するために product_set
が自動的に追加されています。
ForeignKey
には 1 つの必須パラメーター on_delete
があります。 このパラメーターでは、親が削除された場合の処理を Django に指示します。 つまり、カテゴリを削除した場合、そのカテゴリの製品はどうなるべきでしょうか。
最も一般的な 2 つのオプションを次に示します。
CASCADE
。この例でカテゴリが削除されると、すべての製品が削除されます。PROTECT
。製品を含むカテゴリを削除しようとすると、エラーが返されます。
Note
ほとんどの場合は、PROTECT
を使用します。
リレーションシップを作成するようにモデルを更新するには、次のコードを使用できます。
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
category = models.ForeignKey(
'Category', #The name of the model
on_delete=models.PROTECT
)
class Category(models.Model):
name = models.TextField()
# product_set will be automatically created