Skip to content

Instantly share code, notes, and snippets.

@dogrunjp
Last active September 24, 2017 05:32
Show Gist options
  • Save dogrunjp/04fac7cd252738f96a37 to your computer and use it in GitHub Desktop.
Save dogrunjp/04fac7cd252738f96a37 to your computer and use it in GitHub Desktop.
PythonなアプリからJSONを出力する方法はいろいろあると思いますが、SQLAlchemy利用が前提だとJSONシリアライズの前にオブジェクトの変換を自前で作るケースが多いようです。"marshmallow"はデータ型変換ライブラリでORMとの併用が可能です。Flask+SQLAlchemyなアプリからJSONを返すときなどこのライブラリを使うと少し実装が楽になるような……気もします。
##前提としてSQLAlchemyで以下のようなモデルがあるとします。
class Dog(Base):
Birth = Column(Date)
Name = Column(Text)
Breed = Column(Text)
def __init__(self, Birth, Name, Breed):
self.Birth = Birth
self.Name = Name
self.Breed = Breed
##API
from marshmallow import Serialize, fields
@app.route('/mydog')
def mydog():
breed = request.args.get("breed")
params = []
params.append(Dog.Breed.like('%' + breed + '%'))
parm = and_(*params)
dg = session.query(Dog).filter(parm).all()
serialized = dgserializer(dg, many=True).data
return json.dumps(serialized, default=date_handler)
##serializer
class dgserializer(Serializer):
class Meta:
fields = ("Birth", "Name", "Breed")
##Python2.7のJSONはDateオブジェクトを扱えないため、isoformatに変換してからシリアライズする
def date_handler(obj):
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment