皆様ごきげんよう。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