Skip to main content
 首页 » 编程设计

python之GAE 数据存储日期不是 JSON 可序列化的

2025年05月04日15zhoujg

我正在尝试从 App Engine 中的数据存储发送最新的 10 篇文章。

这是数据库:

class Author(ndb.Model): 
    """Sub model for representing an author.""" 
    identity = ndb.StringProperty(indexed=False) 
    email = ndb.StringProperty(indexed=True) 
 
class Message(ndb.Model): 
    """A main model for representing an individual Message entry.""" 
    author = ndb.StructuredProperty(Author) 
    content = ndb.StringProperty(indexed=False) 
    date = ndb.DateTimeProperty(auto_now_add=True) 

这是代码:

class Query(webapp2.RequestHandler): 
    def post(self): 
        message_name = self.request.get('db_name', 
                                         DEFAULT_KEY) 
        message_query = Message.query(ancestor=db_key( 
                                      message_name)).order(-Message.date) 
        messages = message_query.fetch(10) 
 
        items = []  
 
        for message in message_query: 
            items.append({'id': message.author.identity,  
                          'email':message.author.email, 
                          'content':message.content, 
                          'date':message.date})     
 
 
        self.response.headers['Content-Type'] = 'application/json'    
        self.response.out.write(json.dumps(items)) 

错误信息:

TypeError: datetime.datetime(2015, 3, 21, 15, 43, 58, 248650) is not JSON serializable 

为什么 JSON 不能返回该格式的日期? 我如何将其重新格式化为正确的 JSON 格式?

请您参考如下方法:

与其重新发明轮子,我建议在 https://gist.github.com/erichiggins/8969259 上安装和使用 ndb_json.py 模块。 -- 它稳健而优雅地代表您处理各种潜在的陷阱和陷阱。然后,ndb_json.dumps 就是您所需要的。

不过请注意,您发布的代码中存在一个特殊的异常...:

    message_query = Message.query(ancestor=db_key( 
                                  message_name)).order(-Message.date) 
    messages = message_query.fetch(10) 
 
    items = []  
 
    for message in message_query: 
        items.append(...) 

这会将最新的 10 条消息提取到 messages 列表中,然后您可以完全忽略它!,然后所有 older 消息(来自循环查询)被放入无限数量的 items。我不知何故怀疑这实际上是您想要的——也许您的意思是 for 是:

    for message in messages: 
        items.append(...) 

将“仅最新的 10 条消息”序列化为响应,而不是您的代码所做的“ 最新的 10 条消息之外的所有消息”。

所以,如果是这种情况,我建议您使用模块避免所有“items”部分的构建,而只需替换

self.response.out.write(json.dumps(items)) 

与

self.response.write(ndb_json.dumps(messages)) 

(另请注意,out 部分是遗留工件/hack,用于向后兼容 webapp 的旧版本,最好不要在新应用中使用——没有直接关系到您的问题,但是,就像我认为您在序列化“查询的其余部分”而不是“最新的 10 条消息”时可能遇到的错误一样,希望对您有所帮助!-)