这是我的模特课
class Type(enum.Enum):
Certified = "certified"
Non_Certified = "non-certified"
class Status(enum.Enum):
Approved = "Approved"
Rejected = "Rejected"
Published = "Published"
Retired = "Retired"
Waiting_for_Approval = "Waiting_for_Approval"
class DifficultyLevel(enum.Enum):
Beginner = "Beginner"
Intermediate = "Intermediate"
Advanced = "Advanced"
All = "All"
class ActiveStatus(enum.Enum):
Archive = "archive"
Restore = "restore"
class Course(Base):
__tablename__ = 'course'
id = Column(Integer, primary_key=True)
course_code = Column(String(255))
duration_in_hours = Column(Integer)
default_eb_price = Column(Integer)
modified_by = Column(Integer)
modified_on = Column(DateTime)
created_by = Column(Integer)
created_at = Column(DateTime)
type = Column(Enum(Type))
certification_vendor = Column(String(255))
certification_name = Column(String(255))
micro_training_sessions = Column(Integer)
status = Column(Enum(Status))
title = Column(String(255))
summary = Column(String(255))
duration = Column(JSON)
# Categories =
delivery_language = Column(String(255))
course_logo = Column(String(255))
promo_video = Column(String(255))
overview = Column(String(255))
objectives = Column(String(255))
suggested_attendees = Column(String(255))
prerequisites = Column(String(255))
difficulty_level = Column(Enum(DifficultyLevel))
course_facts = Column(JSON)
price = Column(String(255))
list_price = Column(String(255))
early_bird_price = Column(String(255))
next_recommended_course = Column(postgresql.ARRAY(Integer))
specialization_paths = Column(postgresql.ARRAY(Integer))
active_status = Column(Enum(ActiveStatus))
def __getitem__(self, item):
return getattr(self, item)
@property
def serialize(self):
"""Return object data in easily serializeable format"""
serialized_obj = {}
for column in self.__table__.columns:
serialized_obj[column.key] = self[column.key]
return serialized_obj
这个控制器用于编辑更改
def update_course_ctrl(obj,course_id):
args = request.args
course_schema = CourseSchema()
if args is not None :
if args['action'] == "archive":
course = session.query(Course).filter_by(id=course_id).one()
course.active_status = 'Archive'
session.merge(course)
session.commit()
dump_data = course_schema.dump(course).data
return dump_data
# code to archive course
if args['action'] == "restore":
course = session.query(Course).filter_by(id=course_id).one()
course.active_status = 'Restore'
session.merge(course)
session.commit()
dump_data = course_schema.dump(course).data
return dump_data
course = Course(**obj.json)
session.merge(course)
session.commit()
dump_data = course_schema.dump(course).data
return dump_data
这是我在marshmallow文件中的代码
from marshmallow_sqlalchemy import ModelSchema
from sqlalchemy.orm import sessionmaker
from app.extensions import engine
from app.course.models import Course, Project, Topic, Resource
DBSession = sessionmaker(bind=engine)
session = DBSession()
class CourseSchema(ModelSchema):
class Meta:
model = Course
sqla_session = session
在调用此更新函数时,我收到此错误 TypeError:< ActiveStatus.Archive:'archive'>不是JSON可序列化的
答案 0 :(得分:6)
对于枚举字段,最简单的方法是通过pip(pip install marshmallow_enum
)安装名为from marshmallow_enum import EnumField
...
class CourseSchema(ModelSchema):
type = EnumField(Type, by_value=True)
class Meta:
model = Course
sqla_session = session
的包,在项目中导入它,然后在marshmallow模式定义中使用您的自定义覆盖SQLAlchemy字段定义:
by_value
您的自定义定义未覆盖的所有字段都将从您的模型中获取。
您可以尝试使用by_value=True
参数,该参数可以序列化您的枚举的名称(默认值)或值(SELECT t1.name, (CASE
WHEN (t2.name IS NULL)
THEN cat.name
ELSE (CONCAT(t2.name, ',', cat.name))
END) AS t_p
FROM tags t1
LEFT JOIN tags t2
ON t1.parent_id = t2.id
INNER JOIN categories cat
ON t1.category_id = cat.id
)。
答案 1 :(得分:2)
您可以使用棉花糖自定义方法字段
from marshmallow import fields
class CourseSchema(ModelSchema):
type = fields.Method("get_course_type")
def get_course_type(self, obj):
return obj.type.value
class Meta:
model = Course
sqla_session = session
答案 2 :(得分:2)
另一种替代方法是覆盖__str__
的{{1}}方法。例如
Enum