And*_*huk 6 flask flask-sqlalchemy flask-restful
摘要可能很混乱,但我不知道如何将其表述得更简洁。
我拥有的模型:
class Movie(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(
imdb_data = db.relationship('IMDBData', uselist=False)
class IMDBData(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255))
rating = db.Column(db.Float)
movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))
Run Code Online (Sandbox Code Playgroud)
使用 Flask-Restful 字段,我将这样编组响应:
imdb_data_fields = {
'id': fields.Integer,
'title': fields.String,
'rating': fields.Float
}
movie_fields = {
'id': fields.Integer,
'title': fields.String
}
class MovieListAPI(Resource):
def __init__(self):
self.parser = reqparse.RequestParser()
super(MovieListAPI, self).__init__()
def get(self):
self.parser.add_argument('imdb_data', type=str, location='args')
args = self.parser.parse_args()
m_fields = copy.copy(movie_fields)
# TODO: Return empty object if movie.imdb_data = None
if args['imdb_data']:
m_fields['imdb_data'] = fields.Nested(imdb_data_fields)
movies = Movie.query.all()
return {'movies': marshal(movies, m_fields)}
Run Code Online (Sandbox Code Playgroud)
现在,如果电影没有相应的imdb_data
记录,即Movie.query.filter_by(id=123).first().imdb_data = None
电影的对象是这样编组的:
{
"id": 1302,
"imdb_data": {
"id": 0,
"rating": null,
"title": null
},
"title": "F 63 9 Love Sickness"
}
Run Code Online (Sandbox Code Playgroud)
相反,我希望响应如下所示:
{
"id": 1302,
"imdb_data": {},
"title": "F 63 9 Love Sickness"
}
Run Code Online (Sandbox Code Playgroud)
当我返回一部电影(通过 id)时,我知道如何破解它:
if args['imdb_data']:
if movie.imdb_data:
m_fields['imdb_data'] = fields.Nested(imdb_data_fields)
else:
m_fields['imdb_data'] = fields.Nested({})
Run Code Online (Sandbox Code Playgroud)
但是我如何为电影列表做到这一点?也许我可以自己遍历数组并手动更改它,但必须有一种更有效的方法。
这可以通过创建自定义字段来实现,如下所示:
class NestedWithEmpty(Nested):
"""
Allows returning an empty dictionary if marshaled value is None
"""
def __init__(self, nested, allow_empty=False, **kwargs):
self.allow_empty = allow_empty
super(NestedWithEmpty, self).__init__(nested, **kwargs)
def output(self, key, obj):
value = get_value(key if self.attribute is None else self.attribute, obj)
if value is None:
if self.allow_null:
return None
elif self.allow_empty:
return {}
return marshal(value, self.nested)
Run Code Online (Sandbox Code Playgroud)
然后用它来编组传递的对象allow_empty=True
:
m_fields['imdb_data'] = NestedWithEmpty(imdb_data_fields, allow_empty=True)
Run Code Online (Sandbox Code Playgroud)
我什至使用此功能创建了拉取请求:https://github.com/twilio/flask-restful/pull/328
归档时间: |
|
查看次数: |
3286 次 |
最近记录: |