[英]In Peewee I have a datetime field defaulted to datetime.datetime.now(). But when inserted, it takes the time the server was started. Why
[英]I want to store datetime in peewee.DateTimeField(), I use datetime.datetime.now() in that field as default but it can't work
此代码无法工作并给出 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
这个答案非常不正确- 请参阅下面的答案(@coleifer)。
您提供的默认日期不是日期时间对象。 而是一个字符串!
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)
或者
peewee.DateTimeField(default=datetime.datetime.now)
看起来非时区感知日期时间工作正常,因此如果您使用的是 UTC,那么您可以存储datetime.utcnow()
因为它返回当前的 UTC 日期和时间, tzinfo None 即作为“天真的”日期时间对象。
我发现这个解决方案可以将时区感知字段作为文本存储和检索,但是它并不理想,因为日期时间对象没有被存储。
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/
如果要存储日期,请使用 DateField。 此外,默认值必须是可调用的——换句话说,不要使用括号!
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
当需要将其序列化为 Json 时,只需使用可以处理 python datetime.date 对象的自定义 json 格式化程序。 这是正确的方法。 您应该始终使用适当的格式存储数据,并担心在另一层中的表示(和序列化)。
扩展 Python 的 json 序列化器来处理不支持的类型非常简单:
def convert_date(o):
if isinstance(o, datetime.date):
return o.__str__()
json.dumps(my_obj, default=convert_date)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.