繁体   English   中英

我想在 peewee.DateTimeField() 中存储日期时间,我在该字段中默认使用 datetime.datetime.now() 但它无法工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM