Flask SQLAlchemy - пользовательский JSON-кодировщик даты и времени - PullRequest
0 голосов
/ 14 июня 2019

У меня есть эта модель меню, определенная с помощью пользовательской функции 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]}

Это прекрасно работает, за исключением атрибута «create», зависящего от 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 голосов
/ 16 июня 2019

Вы можете просто изменить 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]
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...