【问题标题】:Getting 'str' object has no attribute 'isoformat' for peewee DateTimeField获取'str'对象对于peewee DateTimeField没有属性'isoformat'
【发布时间】:2020-04-10 23:13:20
【问题描述】:

我正在使用 peewee ORM 从 MySQL 数据库中读取数据。我的数据库模型类如下

import peewee
import datetime
from collections import OrderedDict
...............

class User(peewee.Model):
...............

    created_by = CharField(null=True)
    update_by = CharField(null=True)
    updated_date = DateTimeField(default=datetime.datetime.now)
.................

    def __to_dict__(self):
        user_dict = OrderedDict([
.................
            ('created_by', self.created_by),
            ('update_by', self.update_by),
            ('updated_date', self.updated_date.isoformat())
        ])
.............

我在以下代码中设置来自 ORM 的数据

users= User.select().distinct()
return [user.__to_dict__() for user in users]

对于一些更新日期字段为“0000-00-00 00:00:00”的数据行,我收到以下错误

 user = user.__to_dict__()
File "/opt/appserver/app1/app/models/user.py", line 172, in __to_dict__
('updated_date', self.updated_date.isoformat())
AttributeError: 'str' object has no attribute 'isoformat'

为什么会出现这个错误?

PS:AttributeError: 'str' object has no attribute 'isoformat' 没有回答我的问题

【问题讨论】:

  • 您希望self.updated_date 是一个datetime 对象,而实际上它是一个str 对象。 peewee 文档是否提到了DateTimeField 的用法?
  • @DeepSpace 不是,见updated_date = DateTimeField(default=datetime.datetime.now)
  • 您得到的错误非常清楚地表明self.updated_datestr

标签: python peewee


【解决方案1】:

您使用的数据库可能包含无法解析的日期时间,或者在从游标读取数据时无法正确处理。 Peewee 会自动尝试将字符串日期时间值转换为适当的 python 日期时间实例,但如果表中有垃圾或格式奇怪的数据,它将无法工作。

这通常只是 sqlite 数据库的问题,因为其他数据库将强制将有效的日期时间存储在 datetime-affinity 列中。

您可以尝试通过扩展相关字段的支持格式来解决此问题。例如,DateTimeField 有一个它会自动解析的格式列表(field.formats)。您可以扩展它以包含您使用的任何格式。

【讨论】:

  • 谢谢,正如您提到的,update_date 字段有一些值,例如 ''0000-00-00 00:00:00'',我注意到支持的范围是 '1000-01-01 00 Mysql 文档中的 :00:00 到 '9999-12-31 23:59:59'。我已经删除了它们,现在它可以正常工作了
猜你喜欢
  • 1970-01-01
  • 2022-12-19
  • 2021-01-01
  • 2015-02-17
  • 2020-12-18
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多