Masahiro Okubo

Flaskで1対多のJSON APIを作る

Flaskで1対多のJSON APIを作る

日本語ベースのflask関連の記事があんまりないのでまとめてみました〜

Flaskで多対多のJSON APIを作る

pythonはコード量も少なくてシンプルに書けるのでとても楽しいです!

完成物はこちら

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask.json import jsonify

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@localhost/one-to-many'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

"""
    データベースの作成手順は、
    1.まず python コンソールで
    from app import db でインポートして
    2.one-to-manyのデータベースを作成する(直接mySqlで作るか、seqel proなどを使用すると楽です )
    3.作成し終わったら、再びpython コンソールで
    db.create_all() を叩いて完成!
"""


# class にクエリをまとめるととても綺麗になるのでオススメ
class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    hobbies = db.relationship('Hobby', backref='person', lazy='dynamic')
    """
    hobbiesではカラムが追加しているのではなく、Hobbyに対して関連性を設定
    to_dict()メソッドはオブジェクトをjsonで返すためのメソッド
    """

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
            # Personに紐づいているHobbyを全部出力
            'hobby': [Hobby.to_dict(hobby) for hobby in self.hobbies]
        }


class Hobby(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
        }


@app.route('/')
def index():
    return jsonify({"data": [Person.to_dict(person) for person in Person.query.all()]})


if __name__ == '__main__':
    app.run()

特別なことはしていないので、もしわからないところがあれば比較的簡単に情報は見つかるのではないかと思います

データを適当にいれた後
実際に動かしてみるとこんな感じでデータが返ってきます!

参考にした動画


関連記事

copyright© 2016-2021 Masahiro Okubo