【问题标题】:Serializing a sqlalchemy hybrid_property using marshmallow使用棉花糖序列化 sqlalchemy hybrid_property
【发布时间】:2018-11-12 00:19:18
【问题描述】:

我在我的 RESTful 烧瓶应用程序中使用 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')

【问题讨论】:

  • 出于好奇,您是否尝试过将 @property 装饰器堆叠在 hybrid_property 装饰器之上?

标签: python flask sqlalchemy flask-sqlalchemy marshmallow


【解决方案1】:

这有点偷偷摸摸,但我认为问题在于 if self.daily_rula_average_ranges.length > 0: 行导致了 AttributeError 被引发,因为长度通常不是列表的属性。您的意思可能是 if len(self.daily_rula_average_ranges) > 0:

这是一个与 ORM 无关的示例 - 如果引发属性错误,序列化程序不返回任何字段,但如果属性返回适当的数据,则返回数据正常:

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}}

marshmallow 的行为方式并不令人惊讶,因为引发 AttributeError 的属性会看起来好像该属性不存在,例如:

class Person(object):
    @property
    def last_assessment(self):
        raise AttributeError('oops')

hasattr(Person(), 'last_assessment')
# Out: False

【讨论】:

  • 有趣,我会尽快看看这个修复,如果它是正确的,我可以奖励你赏金。可惜要等到我下班回家
  • 是的,看起来就是这样,非常感谢。我责怪使用rails
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2017-11-26
  • 2020-01-20
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多