前回は1対多の関係でしたけど、今回は多対多のデータベースを設計しました〜
完成物
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask.json import jsonify app = Flask(__name__) # sqlalchemyの設定 app.config['SECRET_KEY'] = 'secret' app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@localhost/many-to-many' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # 中間テーブル user_hobbies = db.Table( 'user_hobbies', db.Column('user_id', db.Integer, db.ForeignKey('user.id')), db.Column('hobby_id', db.Integer, db.ForeignKey('hobby.id')) ) """ python コンソールで以下のコードを実行して、UserとHobby、中間テーブルのデータを作成 user1 = User(name='Bob') user2 = User(name='John') user3 = User(name='Mike') db.session.add(user1) db.session.add(user2) db.session.add(user3) h1 = Hobby(name='スノボ') h2 = Hobby(name='野球') h3 = Hobby(name='サッカー') db.session.add(h1) db.session.add(h2) db.session.add(h3) user1.subscriptions.append(h1) user1.subscriptions.append(h2) user1.subscriptions.append(h3) user2.subscriptions.append(h1) user2.subscriptions.append(h3) user3.subscriptions.append(h3) db.session.commit() """ class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) subscriptions = db.relationship('Hobby', secondary=user_hobbies, backref=db.backref('subscribers', lazy='dynamic')) def to_dict(self): return { 'id': self.id, 'name': self.name, 'hobbies': [Hobby.to_dict(c) for c in self.subscriptions] } class Hobby(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) def to_dict(self): return { 'id': self.id, 'name': self.name, } @app.route('/') def index(): return jsonify({"data": [User.to_dict(u) for u in User.query.all()]}) @app.route('/hobbies') def hobbies(): return jsonify({"data": [Hobby.to_dict(h) for h in Hobby.query.all()]}) if __name__ == '__main__': app.run()
データを適当にいれた後は
こんな感じでjsonが返ってきます!
参考にした動画
コメントを残す