Flask SQLAlchemy-自定义日期时间JSON编码器

时间:2019-06-14 18:40:21

标签: python json datetime flask-sqlalchemy

我通过自定义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]}

这很好用,除了“创建的”属性(取决于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()组合并应用此日期时间解决方案?

1 个答案:

答案 0 :(得分:0)

您只需修改serialize()即可返回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]
        }