Django のモデル

完了

モデルは、すべての ORM の中核になります。 モデルは、アプリケーションで使用されるデータの一部を表現したものです。 これには、ユーザー、製品、カテゴリ、またはアプリケーションで必要とするその他の形式のデータがあります。

モデルを作成する

Django では、モデルは django.models.Model の機能のコレクションを継承する任意のクラスです。 コレクションには、データベースに対してクエリを実行したり、新しいエントリを作成したり、更新を保存したりできるメソッドが含まれています。 また、フィールドを定義し、メタデータを設定し、モデル間のリレーションシップを確立することもできます。

ProductCategory という 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__ です。 フィールドが指定されていない場合は、このメソッドを使用してオブジェクトを表示します。 Productname フィールド (すぐに表示される) がある場合は、__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 に設定する場合は、defaultNone に設定します。
  • unique
    • このフィールドには一意の値を含める必要があります。
    • 既定値は False です。
  • min_lengthmax_length
    • 文字列の最小と最大の長さを示すために、文字列型と共に使用されます。
    • 既定値は None です。
  • min_valuemax_value
    • 最小と最大の値を示すために、数値型と共に使用されます。
  • auto_now および auto_now_add
    • 現在の時刻を使用する必要があるかどうかを示すために、日付/時刻型と共に使用されます。
    • auto_now では "常" に、保存時にフィールドが現在の時刻に設定されます。これは last_update フィールドで便利です。
    • auto_now_add では、作成時にフィールドが現在の時刻に設定されます。これは creation_date フィールドで便利です。

Note

nullblank は似ているように見えますが、データベース用語では異なることを意味します。 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