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

时间:2016-12-30 04:55:47

标签: python datetime peewee

此代码无法正常工作并提供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

3 个答案:

答案 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