モブプロだった人のブログ

モブプログラミングに魅了されたエンジニアのブログ

Flask + Flask-SQLAlchemy のチュートリアルを日本語で (Relationships 編)

チュートリアル関連記事

はじめに

今回は、既存の Model(User) に Relationships を追加してみたいと思います。

本格的にやるには、もっと色々考慮するポイントがありますが、まずはざっくりと Relationships を追加してみます。

追加する Model ですが、ユーザごとの投稿記事(Post)のものです。

各ファイルの修正

Python ファイル修正

hello.py ファイルを以下のように修正します。

# 〜〜省略〜〜

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    posts = db.relationship('Post', backref='user', lazy=True) # 複数の Post への紐付け

    def __init__(self, username, posts=[]):
        self.username = username
        self.posts = posts # ユーザ追加時は基本的に空だと思いますが、念のため追加できるようにしておく

# Post クラスを追加
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    body = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) # 一人の User への紐付け

    def __init__(self, title, body, user_id):
        self.title = title
        self.body = body
        self.user_id = user_id

    def __str__(self):
        return self.title

# 〜〜省略〜〜

テンプレートファイル修正

templates/top.html ファイルを以下のように修正します。

<!-- 省略 -->

  <table class="table">
    <thead>
      <tr>
        <th>ID</th>
        <th>名前</th>
        <th>投稿</th> <!-- 項目追加 -->
        <th>詳細</th>
      </tr>
    </thead>
    <tbody>
      {% for user in user_list %}
      <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.username }}</td>
        <td>{{ user.posts|join(', ') }}</td> <!-- 投稿のタイトルをカンマ区切りで表示 -->
        <td>
          <a class="btn btn-success" href="{{ url_for('show_user', user_id=user.id) }}">
            <span class="glyphicon glyphicon-search" aria-hidden="true"></span> 詳細
          </a>
      </td>
      </tr>
      {% endfor %}
    </tbody>
  </table>

<!-- 省略 -->

動作確認前のデータ準備

Python インタプリタを起動し、以下を実行します。

# 色々 import
from hello import db, User, Post

# 一旦データベースを作り直す
db.drop_all()
db.create_all()

# admin ユーザを再作成
user = User('admin')
db.session.add(user)
db.session.commit()

# admin ユーザの投稿を2件作成
post1 = Post('title1', 'body1', user.id)
post2 = Post('title2', 'body2', user.id)
db.session.add(post1)
db.session.add(post2)
db.session.commit()

動作確認

トップページにアクセスすると・・・、

f:id:kaorr_mob:20180121214022p:plain

投稿したタイトルがうまく表示されていますね!

おわりに

今回は、本当にざっくりと Relationships を追加してみました。

また、データベースをばっさりと再作成していますが、本当は Flask-Migrate とか使うと良いと思います。が、説明に時間が掛かりそうなので、今回はばっさりといきました。

次回は、投稿データをどんな感じに表示するのか、どんな感じに変更、削除するのかを考えながら進めていきたいと思います。