Flask-Restful - 返回带有嵌套数组的json

3

我的模型包括用户和图书。我希望将所有图书作为对象数组嵌套在每个用户对象中,以展示每个用户拥有的图书。我正在尝试使用marshal将图书嵌套为列表放在用户字段中,但是没有任何反应。响应中只有用户的数组,没有图书的痕迹,也没有错误代码。思路如下:

books_fields = {
    'id': fields.Integer,
    'type' : fields.String,
    'created_at': fields.DateTime,
    'user_id' : fields.Integer
}

users_fields = {
    'id': fields.Integer,
    'name' : fields.String,
    'created_at': fields.DateTime,
    'books': fields.List(fields.Nested(books_fields))
}


users = session.query(model.Users).outerjoin(model.Cities)
         .filter_by(weather = args.weather).all()

for user in users:
    books = session.query(model.Books).outerjoin(model.Users)
             .filter_by(user_id = user.id).all()
    user.books = marshal(books, books_fields)


return {'users': marshal(users, users_fields)}, 200

问题在于书籍没有显示。

1个回答

3

我认为你需要手动创建一个users字典。对于我来说,Marshal从未以这种方式工作过(假设您的图书查询正在返回行)。

尝试使用类似以下代码:

books_fields = {
    'id': fields.Integer,
    'type' : fields.String,
    'created_at': fields.DateTime,
    'user_id' : fields.Integer
}

users_fields = {
    'id': fields.Integer,
    'name' : fields.String,
    'created_at': fields.DateTime,
    'books': fields.List(fields.Nested(books_fields))
}

users_dict = {}

users = session.query(model.Users).outerjoin(model.Cities)
         .filter_by(weather = args.weather).all()

for user in users:
    books_dict = {}
    books = session.query(model.Books).outerjoin(model.Users)
             .filter_by(user_id = user.id).all()
    for book in books:
        book_dict = {
            'id': book.id,
            'type': book.type,
            'created_at': book.created_at
        }
        books_dict.append(book_dict)

    user_dict = {
        'id': user.id,
        'name': user.name,
        'created_at': user.created_at,
        'books': books_dict
    }
    users_dict.append(user_dict)

return {'users': marshal(users_dict, users_fields)}, 200 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接