使用棉花糖序列化 sqlalchemy hybrid_property
Serializing a sqlalchemy hybrid_property using marshmallow
我在 RESTful flask 应用程序中使用 sqlalchemy 和 marshmallow 来序列化我的模型。我有一个 hybrid_property 来自我在那个模型上的一个关系。我现在想使用相关模型中的模式在我的模式中序列化 hybrid_property。
以前有人做过吗?这是我的相关代码。当我检查响应
时,它似乎没有在模型的序列化版本中包含 last_assessment
class Person(db.Model):
daily_rula_average_ranges = db.relationship('DailyRulaAverageRange', order_by="DailyRulaAverageRange.date", back_populates='person')
@hybrid_property
def last_assessment(self):
if self.daily_rula_average_ranges.length > 0:
return self.daily_rula_average_ranges[-1]
class PersonSchema(ma.Schema):
last_assessment = ma.Nested(DailyRulaAverageRangeSchema, only=['id', 'date', 'risk'])
class Meta:
fields = ('last_assessment')
有点偷偷摸摸,但我认为问题在于行 if self.daily_rula_average_ranges.length > 0:
导致引发 AttributeError,因为长度通常不是列表的属性。你可能是说 if len(self.daily_rula_average_ranges) > 0:
。
这是一个与 ORM 无关的示例 - 如果引发属性错误,序列化程序 returns 没有字段,但如果 属性 返回适当的数据,returns 数据正常:
from marshmallow import fields, Schema
from marshmallow.fields import Nested
class DailyRulaAverageRangeSchema(Schema):
id=fields.UUID()
date=fields.Date()
risk=fields.Integer()
class PersonSchema(Schema):
last_assessment = Nested(DailyRulaAverageRangeSchema, only=['id', 'date', 'risk'])
class Meta:
fields = ('last_assessment',)
class Person(object):
@property
def last_assessment(self):
raise AttributeError('oops')
PersonSchema().dump(Person())
# Out[73]: {}
class Person(object):
@property
def last_assessment(self):
return {"id": None, "date":None, 'risk': 100}
PersonSchema().dump(Person())
# Out[83]: {u'last_assessment': {u'date': None, u'id': None, u'risk': 100}}
棉花糖的这种行为并不奇怪,因为引发 AttributeError 的属性看起来好像该属性不存在,例如:
class Person(object):
@property
def last_assessment(self):
raise AttributeError('oops')
hasattr(Person(), 'last_assessment')
# Out: False
我在 RESTful flask 应用程序中使用 sqlalchemy 和 marshmallow 来序列化我的模型。我有一个 hybrid_property 来自我在那个模型上的一个关系。我现在想使用相关模型中的模式在我的模式中序列化 hybrid_property。
以前有人做过吗?这是我的相关代码。当我检查响应
时,它似乎没有在模型的序列化版本中包含last_assessment
class Person(db.Model):
daily_rula_average_ranges = db.relationship('DailyRulaAverageRange', order_by="DailyRulaAverageRange.date", back_populates='person')
@hybrid_property
def last_assessment(self):
if self.daily_rula_average_ranges.length > 0:
return self.daily_rula_average_ranges[-1]
class PersonSchema(ma.Schema):
last_assessment = ma.Nested(DailyRulaAverageRangeSchema, only=['id', 'date', 'risk'])
class Meta:
fields = ('last_assessment')
有点偷偷摸摸,但我认为问题在于行 if self.daily_rula_average_ranges.length > 0:
导致引发 AttributeError,因为长度通常不是列表的属性。你可能是说 if len(self.daily_rula_average_ranges) > 0:
。
这是一个与 ORM 无关的示例 - 如果引发属性错误,序列化程序 returns 没有字段,但如果 属性 返回适当的数据,returns 数据正常:
from marshmallow import fields, Schema
from marshmallow.fields import Nested
class DailyRulaAverageRangeSchema(Schema):
id=fields.UUID()
date=fields.Date()
risk=fields.Integer()
class PersonSchema(Schema):
last_assessment = Nested(DailyRulaAverageRangeSchema, only=['id', 'date', 'risk'])
class Meta:
fields = ('last_assessment',)
class Person(object):
@property
def last_assessment(self):
raise AttributeError('oops')
PersonSchema().dump(Person())
# Out[73]: {}
class Person(object):
@property
def last_assessment(self):
return {"id": None, "date":None, 'risk': 100}
PersonSchema().dump(Person())
# Out[83]: {u'last_assessment': {u'date': None, u'id': None, u'risk': 100}}
棉花糖的这种行为并不奇怪,因为引发 AttributeError 的属性看起来好像该属性不存在,例如:
class Person(object):
@property
def last_assessment(self):
raise AttributeError('oops')
hasattr(Person(), 'last_assessment')
# Out: False