【问题标题】:Flask SQLAlchemy - custom datetime JSON encoderFlask SQLAlchemy - 自定义日期时间 JSON 编码器
【发布时间】:2019-06-14 18:40:21
【问题描述】:

我使用自定义 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(),更改它会导致各种问题。

那么,如果没有json.dumps(),我该如何组合并应用此日期时间解决方案,仅适用于我上面的self.created 属性?

【问题讨论】:

    标签: python json datetime flask-sqlalchemy


    【解决方案1】:

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

    【讨论】:

    • 这是逃避现实。我们不能像非连环杀手一样注册一个自定义的 json 编码器吗?
    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 2015-12-17
    • 2012-08-20
    • 2017-08-04
    • 1970-01-01
    • 2016-07-26
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多