Djangoで複数のモデルを扱う方法

皆様ごきげんよう。Djangoのmodels.pyの中で複数モデルを取り扱うのに苦戦した為、解決方法をこちらに載せておきます。少しでも参考になりますと幸いです。

models.pyの中に記載する内容

models.pyではデータベースで取り扱いたい項目を各classごとに記載します。そしてdjangoの管理画面にログインすると、アプリ名配下にはmodels.pyで宣言したclassの内容が表示されます。その中で1つ別のclassに、その他classで宣言した内容を含める事も可能です。わかりやすい例としては、ブログ登録フォーム内にタイトル、カテゴリー、フォーム、タグが含まれているイメージ。

(例)django管理画面に表示されるデータ
ー タイトル ※単体のタイトルデータ用モデル
ー カテゴリー ※単体のカテゴリー用モデル
ー フォーム ※単体のフォーム用モデル
ー タグ ※単体のタグ用モデル
ー ブログ投稿フォーム ※このテーブル内には、タイトル・カテゴリー・フォーム・タグ情報すべてを含めています。

1つのclassに、別に宣言した複数のclass内容をまとめる方法

そして以下は、複数のclass内容を1つの別class内に記載するサンプルです。

# 選択肢系のカテゴリーデータ
class Category(models.Model):
    ureshii = 'HAPPY' 
    kanashii = 'SAD'
    normal = 'NORMAL'
    CATEGORY_CHOICES = (
        (ureshii, '嬉しい日'),
        (kanashii, '悲しい日'),
        (normal, '普通の日'),
    )
    name = models.CharField(
        max_length=255,
        blank=False,
        null=True,
        choices=CATEGORY_CHOICES,
        unique=True,)

    def __str__(self):
        return self.name

# 自ら追加できる系のタグデータ
class Tag(models.Model):
    name = models.CharField(
        max_length=255,
        blank=False,
        null=False,
        unique=True,)

    def __str__(self):
        return self.name

# 選択肢系のカテゴリーデータ
class Language(models.Model):
    japanese = 'JP' 
    english = 'EN'
    LANGUAGE_CHOICES = (
        (japanese, '日本語'),
        (english, '英語'),
    )
    name = models.CharField(
        max_length=255,
        blank=False,
        null=True,
        choices=LANGUAGE_CHOICES,
        unique=True,)

    def __str__(self):
        return self.name

# ユーザーが利用する日記の投稿フォーム用データ
class Script(models.Model):
    created = models.DateTimeField(
        auto_now_add=True,
        editable=False,
        blank=False,
        null=False)

    updated = models.DateTimeField(
        auto_now=True,
        editable=False,
        blank=False,
        null=False)

    title = models.CharField(
        max_length=255,
        blank=False,
        null=False)

    body = models.TextField(
        blank=True,
        null=False
        )

    category = models.ForeignKey(
        Category,
        on_delete=models.CASCADE, #一対多の設定ではclassの中で、1つのデータに対して紐づくデータ達の取り扱い方法を設定する。models.CASCADEはcategoryが消されたら紐づくデータもすべて消されるという意味。
        related_name='Category')

    language = models.ForeignKey(
        Language,
        on_delete=models.SET_NULL) #一対多の設定でもしこのLanguageデータが消された場合、models.CASCADEは既にCategoryで設定している為、SET_NULLと設定。Categoryと同様にmodels.CASCADEを設定してしまうと、Djangoアプリケーションがエラーを出力して動かなくなる。

    tags = models.ManyToManyField(
        Tag,
        )

    def __str__(self):
        return self.title

データベースに反映させる

models.pyで追加したデータ情報はちゃんとデータベース側にも反映させる必要があります。

python manage.py makemigrations
python manage.py migrate

管理画面に行くと、このように複数の項目をまとめる事が可能になりました。

Comments are closed

Latest Comments

No comments to show.