如何启用 marshmallow-enum EnumField 以正确序列化 EnumField?
How to enable marshmallow-enum EnumField to correct serialize EnumField?
当我尝试使用 marshmallow 和 marshmallow-enum 包以 JSON 格式序列化 Python 对象时 AttributeError
已被触发 - 'str' object has no attribute 'name'
我有以下 类 与外键链接:
class BusinessUnitsManagement(db.Model, DatabaseObject):
__tablename__ = 'bu_mngmt'
id = db.Column(db.Integer(), primary_key=True)
bu_id = db.Column(db.Integer(), db.ForeignKey('business_units.id'), nullable=False)
head = db.Column(db.Integer(), db.ForeignKey('user_properties.id'), nullable=True)
bu_properties = db.relationship('BusinessUnits', foreign_keys=[bu_id], backref='bu_mngmt')
head_properties = db.relationship('UserProperty', foreign_keys=[head])
class UserProperty(db.Model, DatabaseObject):
__tablename__ = 'user_properties'
id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
seniority = db.Column(db.Enum(Seniority), nullable=True)
class BusinessUnits(db.Model):
__tablename__ = 'business_units'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(5), nullable=False)
description = db.Column(db.String(100), nullable=True)
此外,我还为以上 类:
创建了架构 类
from marshmallow import Schema, fields
from marshmallow_enum import EnumField
class BusinessUnitsManagementSchema(Schema):
id = fields.Int()
bu_properties = fields.Nested(BusinessUnitsSchema)
head_properties = fields.Nested(UserPropertySchema)
class UserPropertySchema(Schema):
id = fields.Int()
full_name = fields.Str()
seniority = EnumField(Seniority)
class BusinessUnitsSchema(Schema):
id = fields.Int()
name = fields.Str()
description = fields.Str()
资历定义为:
Seniority = Enum(
value='Seniority',
names=[
('Intern', 'Intern'),
('Junior_Engineer', 'Junior_Engineer'),
('Junior Engineer', 'Junior Engineer'),
('Design Engineer', 'Design Engineer'),
('Design_Engineer', 'Design_Engineer'),
('Senior Engineer', 'Senior Engineer'),
('Senior_Engineer', 'Senior_Engineer')
]
)
当我尝试获取 Python 个对象的 JSON 格式时:
from marshmallow import Schema, fields
from marshmallow_enum import EnumField
objects = BusinessUnitsManagement.query.join(BusinessUnits).all()
result = []
for object in objects:
marshmallow_item = BusinessUnitsManagementSchema.dumps(object)
result.append(marshmallow_item.data)
return result
我在 Ubuntu 上收到此错误,但在 Windows 上一切正常:
marshmallow-enum version on both Win and Ubuntu --- 1.5.1
Python version on Win 10 ---------- 3.6.6
Python version on Ubuntu 16.04.3 -- 3.5.2
marshmallow_item = schema.dumps(item)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/schema.py", line 557, in dumps
deserialized, errors = self.dump(obj, many=many, update_fields=update_fields)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/schema.py", line 509, in dump
**kwargs
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 138, in serialize
index=(index if index_errors else None)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
value = getter_func(data)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 132, in <lambda>
getter = lambda d: field_obj.serialize(attr_name, d, accessor=accessor)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/fields.py", line 252, in serialize
return self._serialize(value, attr, obj)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/fields.py", line 450, in _serialize
update_fields=not self.__updated_fields)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/schema.py", line 509, in dump
**kwargs
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 138, in serialize
index=(index if index_errors else None)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
value = getter_func(data)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 132, in <lambda>
getter = lambda d: field_obj.serialize(attr_name, d, accessor=accessor)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/fields.py", line 252, in serialize
return self._serialize(value, attr, obj)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow_enum/__init__.py", line 80, in _serialize
return value.name
AttributeError: 'str' object has no attribute 'name'
问题与数据库有关,更具体地说,问题与列 'seniority' 的值有关。有些行将 'seniority' 设置为空白(不是 NULL - 只是空字符串),因此这就是序列化未正确完成的原因。我不知道这是怎么发生的,因为 'seniority' 列被设置为 ENUM 类型。
当我尝试使用 marshmallow 和 marshmallow-enum 包以 JSON 格式序列化 Python 对象时 AttributeError
已被触发 - 'str' object has no attribute 'name'
我有以下 类 与外键链接:
class BusinessUnitsManagement(db.Model, DatabaseObject):
__tablename__ = 'bu_mngmt'
id = db.Column(db.Integer(), primary_key=True)
bu_id = db.Column(db.Integer(), db.ForeignKey('business_units.id'), nullable=False)
head = db.Column(db.Integer(), db.ForeignKey('user_properties.id'), nullable=True)
bu_properties = db.relationship('BusinessUnits', foreign_keys=[bu_id], backref='bu_mngmt')
head_properties = db.relationship('UserProperty', foreign_keys=[head])
class UserProperty(db.Model, DatabaseObject):
__tablename__ = 'user_properties'
id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
seniority = db.Column(db.Enum(Seniority), nullable=True)
class BusinessUnits(db.Model):
__tablename__ = 'business_units'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(5), nullable=False)
description = db.Column(db.String(100), nullable=True)
此外,我还为以上 类:
创建了架构 类from marshmallow import Schema, fields
from marshmallow_enum import EnumField
class BusinessUnitsManagementSchema(Schema):
id = fields.Int()
bu_properties = fields.Nested(BusinessUnitsSchema)
head_properties = fields.Nested(UserPropertySchema)
class UserPropertySchema(Schema):
id = fields.Int()
full_name = fields.Str()
seniority = EnumField(Seniority)
class BusinessUnitsSchema(Schema):
id = fields.Int()
name = fields.Str()
description = fields.Str()
资历定义为:
Seniority = Enum(
value='Seniority',
names=[
('Intern', 'Intern'),
('Junior_Engineer', 'Junior_Engineer'),
('Junior Engineer', 'Junior Engineer'),
('Design Engineer', 'Design Engineer'),
('Design_Engineer', 'Design_Engineer'),
('Senior Engineer', 'Senior Engineer'),
('Senior_Engineer', 'Senior_Engineer')
]
)
当我尝试获取 Python 个对象的 JSON 格式时:
from marshmallow import Schema, fields
from marshmallow_enum import EnumField
objects = BusinessUnitsManagement.query.join(BusinessUnits).all()
result = []
for object in objects:
marshmallow_item = BusinessUnitsManagementSchema.dumps(object)
result.append(marshmallow_item.data)
return result
我在 Ubuntu 上收到此错误,但在 Windows 上一切正常:
marshmallow-enum version on both Win and Ubuntu --- 1.5.1
Python version on Win 10 ---------- 3.6.6
Python version on Ubuntu 16.04.3 -- 3.5.2
marshmallow_item = schema.dumps(item)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/schema.py", line 557, in dumps
deserialized, errors = self.dump(obj, many=many, update_fields=update_fields)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/schema.py", line 509, in dump
**kwargs
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 138, in serialize
index=(index if index_errors else None)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
value = getter_func(data)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 132, in <lambda>
getter = lambda d: field_obj.serialize(attr_name, d, accessor=accessor)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/fields.py", line 252, in serialize
return self._serialize(value, attr, obj)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/fields.py", line 450, in _serialize
update_fields=not self.__updated_fields)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/schema.py", line 509, in dump
**kwargs
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 138, in serialize
index=(index if index_errors else None)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
value = getter_func(data)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/marshalling.py", line 132, in <lambda>
getter = lambda d: field_obj.serialize(attr_name, d, accessor=accessor)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow/fields.py", line 252, in serialize
return self._serialize(value, attr, obj)
File ".../flaskvenv/lib/python3.5/site-packages/marshmallow_enum/__init__.py", line 80, in _serialize
return value.name
AttributeError: 'str' object has no attribute 'name'
问题与数据库有关,更具体地说,问题与列 'seniority' 的值有关。有些行将 'seniority' 设置为空白(不是 NULL - 只是空字符串),因此这就是序列化未正确完成的原因。我不知道这是怎么发生的,因为 'seniority' 列被设置为 ENUM 类型。