モデルの定義
モデル
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)