Это немного подлый, но я считаю, что проблема в том, что строка 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}}
Это не такслишком удивительно, что зефир ведет себя так, потому что атрибут, вызывающий ошибку AttributeError, будет выглядеть так, как будто атрибут не существует, например:
class Person(object):
@property
def last_assessment(self):
raise AttributeError('oops')
hasattr(Person(), 'last_assessment')
# Out: False