View on GitHub

モデルの定義

Home

モデルの定義

モデル

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

参考

  1. 株式会社オープントーン,佐藤大輔,伊東直喜,上野啓二,『実装で学ぶフルスタックWeb開発 エンジニアの視野と知識を広げる「一気通貫」型ハンズオン』,翔泳社,2023.
    • 4-3 バックエンド(API)とフロントエンド(画面)の連携
    • 6-3 バックエンドでモデルを作成する
  2. 横瀬明仁,『現場で使える Django の教科書《基礎編》』,2018.
    • 第6章 モデル (Model)