モデルの定義
モデル
backend/api/online/models.py
...(略)...
class Genre(models.Model):
"""ジャンルモデル
Attributes
----------
id : IntegerField
ジャンルID
name : TextField
ジャンル名
"""
id = models.IntegerField(primary_key=True)
name = models.TextField(blank=False, null=False)
class Meta:
managed = True
db_table = 'genres'
def __str__(self):
return '{}:{}'.format(self.id, self.name)
class Movie(models.Model):
"""映画モデル
Attributes
----------
id : IntegerField
映画ID
title : TextField
タイトル
year : IntegerField
公開年
genres : ManyToManyField[Genre]
ジャンルリスト
imdb_id: IntegerField
IMDb ID
tmdb_id: IntegerField
TMDB ID
"""
id = models.IntegerField(primary_key=True)
title = models.TextField(blank=False, null=False)
year = models.IntegerField(blank=True, null=True)
genres = models.ManyToManyField(Genre)
imdb_id = models.IntegerField(blank=True, null=True)
tmdb_id = models.IntegerField(blank=True, null=True)
class Meta:
managed = True
db_table = 'movies'
def __str__(self):
return '{}:{}({})'.format(self.id, self.title, self.year)
マイグレーション
(recsys_full) backend$ python manage.py makemigrations online --settings config.settings.development
Migrations for 'online':
api/online/migrations/0002_genre_movie.py
+ Create model Genre
+ Create model Movie
(recsys_full) backend$ python manage.py migrate --settings config.settings.development
テーブルの確認
recsys_full=# \dt
List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+-------
...(略)...
public | genres | table | rsl
public | movies | table | rsl
public | movies_genres | table | rsl
public | users | table | rsl
(14 rows)
recsys_full=# \d movies
Table "public.movies"
Column | Type | Collation | Nullable | Default
---------+---------+-----------+----------+---------
id | integer | | not null |
title | text | | not null |
year | integer | | |
imdb_id | integer | | |
tmdb_id | integer | | |
Indexes:
"movies_pkey" PRIMARY KEY, btree (id)
Referenced by:
TABLE "movies_genres" CONSTRAINT "movies_genres_movie_id_debb1461_fk_movies_id" FOREIGN KEY (movie_id) REFERENCES movies(id) DEFERRABLE INITIALLY DEFERRED
recsys_full=# \d genres
Table "public.genres"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | not null |
name | text | | not null |
Indexes:
"genres_pkey" PRIMARY KEY, btree (id)
Referenced by:
TABLE "movies_genres" CONSTRAINT "movies_genres_genre_id_b0452298_fk_genres_id" FOREIGN KEY (genre_id) REFERENCES genres(id) DEFERRABLE INITIALLY DEFERRED
recsys_full=# \d movies_genres
Table "public.movies_genres"
Column | Type | Collation | Nullable | Default
----------+---------+-----------+----------+----------------------------------
id | bigint | | not null | generated by default as identity
movie_id | integer | | not null |
genre_id | integer | | not null |
Indexes:
"movies_genres_pkey" PRIMARY KEY, btree (id)
"movies_genres_genre_id_b0452298" btree (genre_id)
"movies_genres_movie_id_debb1461" btree (movie_id)
"movies_genres_movie_id_genre_id_24b9458e_uniq" UNIQUE CONSTRAINT, btree (movie_id, genre_id)
Foreign-key constraints:
"movies_genres_genre_id_b0452298_fk_genres_id" FOREIGN KEY (genre_id) REFERENCES genres(id) DEFERRABLE INITIALLY DEFERRED
"movies_genres_movie_id_debb1461_fk_movies_id" FOREIGN KEY (movie_id) REFERENCES movies(id) DEFERRABLE INITIALLY DEFERRED
参考
- 株式会社オープントーン,佐藤大輔,伊東直喜,上野啓二,『実装で学ぶフルスタックWeb開発 エンジニアの視野と知識を広げる「一気通貫」型ハンズオン』,翔泳社,2023.
- 4-3 バックエンド(API)とフロントエンド(画面)の連携
- 6-3 バックエンドでモデルを作成する
- 横瀬明仁,『現場で使える Django の教科書《基礎編》』,2018.
- 第6章 モデル (Model)