python - Flask SQLAlchemy - 自定义日期时间 JSON 编码器
问题描述
我用自定义JSON
serialization()
函数定义了这个菜单模型:
from sqlalchemy.sql import func
class Menu(db.Model):
__tablename__='menu'
id = db.Column(db.Integer, primary_key=True)
created = db.Column(db.DateTime, default=func.now(), nullable=False)
dishes = db.relationship('Dish',
back_populates='menu',
uselist=True)
def serialize(self):
"""Return object data in easily serializeable format"""
return
{ 'id' : self.id,
'created': self.created,
'dishes' : [ item.serialize() for item in self.dishes]}
这工作正常,除了 'created' 属性,依赖于datetime
,它会抛出臭名昭著的TypeError: Object of type 'datetime' is not JSON serializable
错误。
通常,可以通过子类化来解决整个数据字典的这个日期时间错误,如下所示:
from datetime import datetime
import json
class DateTimeEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime):
return o.isoformat()
return json.JSONEncoder.default(self, o)
并这样称呼:
json.dumps(yourobj, cls=DateTimeEncoder)
但是我不能序列化我所有的模型,json.dumps()
因为我自己serialize()
在模型中,改变它会导致各种各样的问题。
那么如何仅针对我self.created
上面的属性组合和应用此日期时间解决方案,而不使用json.dumps()
?
解决方案
你可以修改serialize()
为 return self.created.isoformat()
。
def serialize(self):
"""Return object data in easily serializeable format"""
return {
'id': self.id,
'created': self.created.isoformat(),
'dishes': [item.serialize() for item in self.dishes]
}
推荐阅读
- java - 连接失败:ECONNREFUSED(连接被拒绝)
- apache-spark - PYSPARK DF MAP:获取火花图中给定键的值
- flutter - 如何在飞镖中加载嵌套地图?
- groovy - 在 Groovy 中重构 Switch
- scala - Scala FunctionN tupled vs curried 结果解释
- javascript - JSF 2.3 与某些没有结束标记的 HTML5 元素不兼容,如链接
- c++ - 当我将一个类对象推回一个初始化的类向量时,我遇到了一个很长很奇怪的错误
- node.js - 通过 Node.js 向 Cassandra / Scylla 添加 65M 记录
- javascript - Mongodb更新集合中的字段,同时自动生成另一个字段
- python - 能够选择一个数字并显示该数字的值