【Django】備忘録-モデル定義の仕方いろいろ

筆者は自己学習の一環でDjangoを使用しています。以下の内容が業界標準かどうかは保証できません。

主キー

from django.db import models

class Hoge(models.Model):
    id = models.AutoField(primary_key=True)  # 主キー

外部キーによるテーブルの関連付け

下記画像のようなER図とテーブル定義をmodels.pyで表現する
※見づらかったり、おかしな設計だったりは見逃してください

from django.db import models  # 必須なインポート


class TrnCustomer(models.Model):
    # Djangoで主キーを自動採番
    id = models.AutoField(primary_key=True)
    # Djangoで更新日時を自動登録
    update_at = models.DateTimeField(auto_now=True)

    class Meta:
        # テーブル名を指定
        db_table = 'TRN_CUSTOMER'

class TrnCustomerDetail(models.Model):
    # 外部キーの設定
    id = models.ForeignKey(TrnCustomer, on_delete=models.CASCADE, db_column='id')
    # Djangoで主キーを自動採番
    detail_id = models.AutoField(primary_key=True)
    # Djangoで更新日時を自動登録
    update_at = models.DateTimeField(auto_now=True)

    class Meta:
        # テーブル名を指定
        db_table = 'TRN_CUSTOMER_DETAIL'
AutoField自動採番(PK に使用)
DateTimeField(auto_now=True)更新日時(TIMESTAMP)を自動で更新
ForeignKey(..., db_column='id')外部キー名が親テーブルの id と同じなので、db_column で明示
on_delete=models.CASCADE親が削除されたら子も削除されるように指定
db_table物理テーブル名を指定

日時などの自動登録

class Hoge(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)  # 作成日時
    updated_at = models.DateTimeField(auto_now=True)  # 更新日時
オプション主な用途挙動
auto_now_add作成日時の記録初回作成時のみ値をセット
auto_now更新日時の記録保存するたびに更新される

データ型はDBMSによって異なる

Django/Pythondatetime.datetime
SQLiteTEXT
PostgreSQLTIMESTAMP WITH TIME ZONE(既定)
MySQLDATETIME または TIMESTAMP

データベースに格納する時に値を変換したい場合

例えば〇と×の選択肢があったとして、「〇を選択した場合は1」で「×なら2」というような状況。
この場合はmodels.pyで対応します。

# models.py

class hoge():
    # 変換方法を定義
    CHOICES = [
        (1, "〇"),
        (2, "×")
    ]
    # フィールドを定義
    answer = models.CharField(max_length=1, choices=CHOICES)
    

コメント

タイトルとURLをコピーしました