简体   繁体   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

this code cannot work and give json serializable error此代码无法工作并给出 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

This answer is very incorrect - please see my answer below (@coleifer).这个答案非常不正确- 请参阅下面的答案(@coleifer)。


The default date that you are providing is not a datetime object.您提供的默认日期不是日期时间对象。 Rather it's a string!而是一个字符串!

modify_date = peewee.DateTimeField(default=datetime.datetime.now().strftime('%Y-%m-%d'))

type(datetime.datetime.now().strftime('%Y-%m-%d')) --> str type(datetime.datetime.now().strftime('%Y-%m-%d')) --> str

You can pass default current datetime object like this:您可以像这样传递默认的当前日期时间对象:

date = datetime.datetime.now().strftime('%Y-%m-%d')
need_date = datetime.strptime(date, '%Y-%m-%d')

modify_date = peewee.DateTimeField(default=need_date)

or或者

peewee.DateTimeField(default=datetime.datetime.now)

It looks like non-timezone aware datetimes work fine, so if you're using UTC then you can store datetime.utcnow() as that returns the current UTC date and time with tzinfo None ie as a "naive" datetime object.看起来非时区感知日期时间工作正常,因此如果您使用的是 UTC,那么您可以存储datetime.utcnow()因为它返回当前的 UTC 日期和时间, tzinfo None 即作为“天真的”日期时间对象。

I found this solution to store and retrieve the timezone aware field as text, however it's not ideal as the datetime object isn't being stored.我发现这个解决方案可以将时区感知字段作为文本存储和检索,但是它并不理想,因为日期时间对象没有被存储。

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/ https://compileandrun.com/python-peewee-timezone-aware-datetime/

If you want to store a date, use the DateField.如果要存储日期,请使用 DateField。 Also, the default needs to be a callable -- in other words, leave OFF the parentheses!此外,默认值必须是可调用的——换句话说,不要使用括号!

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

When it comes time to serialize this as Json, just use a custom json formatter that can handle python datetime.date objects.当需要将其序列化为 Json 时,只需使用可以处理 python datetime.date 对象的自定义 json 格式化程序。 This is the proper way.这是正确的方法。 You should always store your data using the appropriate format and worry about presentation (and serialization) in another layer.您应该始终使用适当的格式存储数据,并担心在另一层中的表示(和序列化)。

It is very simple to extend Python's json serializer to handle unsupported types:扩展 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.

相关问题 在Peewee中,我有一个datetime字段默认为datetime.datetime.now()。 但是在插入时,需要花费服务器启动的时间。 为什么 - In Peewee I have a datetime field defaulted to datetime.datetime.now(). But when inserted, it takes the time the server was started. Why 日期时间.日期时间.now() + 1 - datetime.datetime.now() + 1 Django DateTimeField 和 datetime.datetime.now() 给出不同的时间 - Django DateTimeField and datetime.datetime.now() giving different times 无法将datetime.now()保存到DateTimeField - Can't save datetime.now() to DateTimeField 如何将datetime.datetime.now()转换为Number - How to Convert datetime.datetime.now() to Number datetime.datetime.now()返回旧值 - datetime.datetime.now() returns old value datetime.datetime.now 在多处理中的性能 - Performance of datetime.datetime.now in multiprocessing 使用Flexmock datetime.datetime.now进行模拟 - Mocking with Flexmock datetime.datetime.now 为什么datetime.datetime.now()-datetime.datetime.now()等于datetime.timedelta(-1,86399,999974)? - Why does datetime.datetime.now() - datetime.datetime.now() equal to datetime.timedelta(-1, 86399, 999974)? Pandas datetime 失败时 mocking datetime.datetime.now() - Pandas datetime failing when mocking datetime.datetime.now()
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM