marshal_with 用于 Flask RESTful 中的 SQLAlchemy 对象列表

问题描述

我正在尝试使用 marshal_with 中的 flask_restful 序列化 JSON 中的 sqlAlchemy 对象列表。对于单个对象,它对我有用。

from flask import Flask
from flask_sqlalchemy import sqlAlchemy
from flask_restful import Resource,Api,marshal_with,reqparse,fields

app = Flask(__name__)
db = sqlAlchemy(app)
api = Api(app)

app.config['sqlALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False

class Person(db.Model):
  id = db.Column(db.Integer,primary_key=True)
  name = db.Column(db.String(30),nullable=False)

  pets = db.relationship('Pet',backref='owner')

  def __init__(self,name):
    self.name = name

  @classmethod
  def find_by_id(cls,id):
    return cls.query.filter_by(id=id).first()

  def save_to_db(self):
    db.session.add(self)
    db.session.commit()

  def delete_from_db(self):
    db.session.delete(self)
    db.session.commit()


class Pet(db.Model):
  id = db.Column(db.Integer,primary_key=True)
  name = db.Column(db.String(20),nullable=False)
  owner_id = db.Column(db.Integer,db.ForeignKey('person.id'))

  def __init__(self,name,owner_id):
    self.name = name
    self.owner_id = owner_id

  @classmethod
  def find_by_id(cls,id):
    return cls.query.filter_by(id=id).first()

  def save_to_db(self):
    db.session.add(self)
    db.session.commit()

  def delete_from_db(self):
    db.session.delete(self)
    db.session.commit()

pet_serializer = {
  'id':fields.Integer,'name':fields.String
}

person_serializer = {
  'id':fields.Integer,'name':fields.String,'pets':fields.nested(pet_serializer)
}

person_list_serializer = {
  'items':fields.List(fields.nested(person_serializer))
}

class PersonController(Resource):
  @marshal_with(person_serializer)
  def get(self,id):
    person = Person.find_by_id(id)
    if person:
        return person,200
    else:
        return {'msg':'Resource not found'},404

class PersonListController(Resource):
  @marshal_with(person_list_serializer)
  def get(self):
    return Person.query.all()

api.add_resource(PersonController,'/person/<int:id>')
api.add_resource(PersonListController,'/persons')

if __name__ == '__main__':
  app.run(debug=True,port=5000)

PersonController get 请求的 API 响应如下:

{
"id": 1,"name": "Leo","pets": [
    {
        "id": 1,"name": "Spoc"
    }
  ]
}

但是对于 PersonListController get 请求,我得到的是空响应:

[
  {
    "items": null
  },{
    "items": null
  }
]

请谁能帮我解决这里的问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)