gpt4 book ai didi

python - 如何将 CodecOptions 应用于 mongoengine 集合以获取 tzinfo?

转载 作者:太空宇宙 更新时间:2023-11-03 16:32:21 26 4
gpt4 key购买 nike

使用 mongoengine Document,当我从 mongo 加载 DateTimeField 时,它缺少 tzinfo。我们的应用程序按策略希望所有日期时间都具有 tzinfo

当我保存到 mongo 时,我知道 pymongo 在时区方面做了正确且可预测的事情;如果它很简单,则将其存储为 UTC 时间,如果它有时区,则将其转换为 UTC,然后存储为 UTC 时间。到目前为止一切都很好。

但是,当我加载时,DateTimeField 总是给我一个天真的日期时间。我知道这个 datetime 采用 UTC 格式,因此如果需要,我可以添加 tzinfo,但我必须在应用程序中的几十个地方执行此操作,并且这是 future 时区错误的保证,除非我使用自定义字段类型(请参见下面的示例)。

引用:https://api.mongodb.com/python/current/examples/datetimes.html我知道 pymongo 支持将 tzinfo 从数据库到达时放入对象上。我也知道我自己可以做到这一点,如下面的最小示例所示。 DateTimeTZFieldto_python 中添加 tzinfo

from datetime import datetime

from mongoengine import connect, Document, fields

from pytz import timezone

def utcnowTZ():
return datetime.utcnow().replace(tzinfo=timezone('UTF'))

class DateTimeTZField(fields.DateTimeField):
"""
This seems like a hack. I would like to use CodecOptions instead
"""
def to_python(self, value):
converted = super(DateTimeTZField, self).to_python(value)
return converted.replace(tzinfo=timezone('UTC'))

class Thing(Document):
dtTZ = DateTimeTZField(default=utcnowTZ)
dtXX = fields.DateTimeField(default=utcnowTZ)

connect(host="mongodb://localhost/datetimewithtz")
Thing.objects().delete()

t1 = Thing()
print '%r.dtXX (default): %s' % (t1, t1.dtXX)
print '%r.dtTZ (default): %s' % (t1, t1.dtTZ)
t1.save()
print 'saved %r' % t1.id; print
t1 = Thing.objects(id=t1.id).first()
print 'reloaded %r' % t1.id
print '%r.dtXX (loaded ): %s' % (t1, t1.dtXX)
print '%r.dtTZ (loaded ): %s' % (t1, t1.dtTZ)

无需在整个应用程序中替换 DateTimeField,有没有办法使用 bson CodecOptions 使其全局适用于所有 DateTimeFields:从数据库加载时,他们应该附加tzinfo

最佳答案

怎么样

connect(...,  tz_aware=True,...)

参数将被转发到 MongoClient(..., tz_aware=True, ...)

关于python - 如何将 CodecOptions 应用于 mongoengine 集合以获取 tzinfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com