首页 > 解决方案 > 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()

标签: pythonjsondatetimeflask-sqlalchemy

解决方案


你可以修改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]
        }

推荐阅读