如何启用棉花糖枚举EnumField来更正序列化EnumField?

马蒂娅·卢基奇(Matija Lukic)

当我尝试使用棉花糖将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)

另外,我为上述这些类创建Schema类:

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'
马蒂娅·卢基奇(Matija Lukic)

问题与数据库有关,更具体地说,问题出在“高级”列的值上。有些行的“ seniority”设置为空白(不是NULL-只是空字符串),因此这就是序列化未正确完成的原因。我不知道这是怎么发生的,因为“高级”列设置为ENUM类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何用棉花糖序列化MongoDB ObjectId?

来自分类Dev

如何用棉花糖序列化MongoDB ObjectId?

来自分类Dev

用棉花糖序列化日期时间的简便方法

来自分类Dev

如何将上下文传递给棉花糖中的嵌套序列化器?

来自分类Dev

使用棉花糖python反序列化模型中的json模型

来自分类Dev

使用sqlalchemy棉花糖难以序列化Geography列类型

来自分类Dev

用棉花糖序列化两个嵌套模式

来自分类Dev

使用棉花糖python反序列化模型中的json模型

来自分类Dev

棉花糖序列化 - 一种基于每个字段捕获异常的方法?

来自分类Dev

嵌套结构时棉花糖反序列化失败

来自分类Dev

枚举圆序列化

来自分类Dev

Play框架:如何在JSON中对枚举进行序列化/反序列化

来自分类Dev

序列化中引用共享的含义是什么?枚举如何序列化?

来自分类Dev

如何序列化一组枚举?

来自分类Dev

如何反序列化JSON字符串以枚举

来自分类Dev

如何序列化一组枚举?

来自分类Dev

Java枚举字段序列化/反序列化

来自分类Dev

如何使用Jackson来反序列化对象变量?

来自分类Dev

JAXB枚举字段未序列化

来自分类Dev

序列化可空枚举wcf

来自分类Dev

BreezeSharp-枚举序列化失败

来自分类Dev

用Jackson反序列化枚举

来自分类Dev

ServiceStack枚举序列化与WebApi

来自分类Dev

(反)序列化枚举集

来自分类Dev

反序列化枚举C#

来自分类Dev

Java中枚举的反序列化

来自分类Dev

从JSON反序列化Java枚举

来自分类Dev

BreezeSharp-枚举序列化失败

来自分类Dev

Corda 枚举序列化和 PersistentState