gpt4 book ai didi

flask - 如果关联为无,则为 SQLAlchemy 关联返回带有 Flask-Restful 嵌套字段对象的空 JSON 对象

转载 作者:行者123 更新时间:2023-12-03 15:52:02 26 4
gpt4 key购买 nike

摘要可能很困惑,但我不知道如何将其表述得更简洁。

我拥有的模型:

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'))

使用 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)}

现在,如果碰巧一部电影没有相应的 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"
}

相反,我希望响应如下所示:
{
"id": 1302,
"imdb_data": {},
"title": "F 63 9 Love Sickness"
}

当我返回一部电影(通过 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({})

但是我如何为电影列表做到这一点?也许我可以自己遍历数组并手动更改它,但必须有一种更有效的方法。

最佳答案

这可以通过创建自定义字段来实现,如下所示:

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)

然后使用它来编码传递 allow_empty=True 的对象:
m_fields['imdb_data'] = NestedWithEmpty(imdb_data_fields, allow_empty=True)

我什至用这个功能创建了一个拉取请求: https://github.com/twilio/flask-restful/pull/328

关于flask - 如果关联为无,则为 SQLAlchemy 关联返回带有 Flask-Restful 嵌套字段对象的空 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26867357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com