此代码无法正常工作并提供json序列化错误
class Bank(peewee.Model): // create Bank table
bank_id = peewee.PrimaryKeyField()
bank_name = peewee.CharField()
account_no = peewee.CharField()
ifc_code = peewee.CharField()
swift_code = peewee.CharField(null = True)
modify_date = peewee.DateTimeField(default=datetime.datetime.now(),formats=['%Y-%m-%d'])/*date in yyyy-mm-dd formate*/
status = peewee.IntegerField(default = 0)
class Meta:
database = db
答案 0 :(得分:4)
您提供的默认日期不是日期时间对象。相反,它是一个字符串!
modify_date = peewee.DateTimeField(default=datetime.datetime.now().strftime('%Y-%m-%d'))
type(datetime.datetime.now().strftime('%Y-%m-%d'))
- >的 str
强>
您可以像这样传递默认的当前日期时间对象:
date = datetime.datetime.now().strftime('%Y-%m-%d')
need_date = datetime.strptime(date, '%Y-%m-%d')
modify_date = peewee.DateTimeField(default=need_date)
答案 1 :(得分:-1)
看起来非时区意识的日期时间可以正常工作,因此,如果您使用的是UTC,则可以存储datetime.utcnow()
,因为它返回带有tzinfo None的当前UTC日期和时间,即作为“原始”日期时间对象
我发现此解决方案可以将可识别时区的字段存储为文本,但是由于不存储datetime对象,因此它不是理想的选择。
from datetime import datetime
from peewee import *
class TimestampTzField(Field):
"""
A timestamp field that supports a timezone by serializing the value
with isoformat.
"""
field_type = "TEXT"
def db_value(self, value: datetime) -> str:
if value:
return value.isoformat()
def python_value(self, value: str) -> str:
if value:
return datetime.fromisoformat(value)
https://compileandrun.com/python-peewee-timezone-aware-datetime/
答案 2 :(得分:-1)
如果要存储日期,请使用DateField。另外,默认值必须是可调用的-换句话说,请不要将括号括起来!
input
当需要将其序列化为Json时,只需使用可处理python datetime.date对象的自定义json格式化程序即可。这是正确的方法。您应该始终使用适当的格式存储数据,并担心在另一层中进行表示(和序列化)。
扩展Python的json序列化器以处理不受支持的类型非常简单:
class Bank(peewee.Model): // create Bank table
bank_id = peewee.PrimaryKeyField()
bank_name = peewee.CharField()
account_no = peewee.CharField()
ifc_code = peewee.CharField()
swift_code = peewee.CharField(null = True)
modify_date = peewee.DateField(default=datetime.date.today)
status = peewee.IntegerField(default = 0)
class Meta:
database = db