Python 如何对mongoengine集合应用codeOptions以获取tzinfo?

Python 如何对mongoengine集合应用codeOptions以获取tzinfo?,python,mongodb,pymongo,mongoengine,bson,Python,Mongodb,Pymongo,Mongoengine,Bson,使用mongoengine文档,当我从mongo加载日期时间字段时,它缺少tzinfo。我们的策略应用程序希望所有日期时间都具有tzinfo 当我保存到mongo时,我知道pymongo在时区内做了正确且可预测的事情;如果它是原始的,则存储为UTC时间;如果它有时区,则将其转换为UTC,然后存储为UTC时间。到目前为止一切都很好 但是,当我加载时,datetime字段总是给我一个简单的datetime。我知道这个datetime是UTC格式的,所以如果我愿意,我可以添加tzinfo,但我必须在我

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

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

但是,当我加载时,
datetime字段
总是给我一个简单的
datetime
。我知道这个
datetime
是UTC格式的,所以如果我愿意,我可以添加
tzinfo
,但我必须在我的应用程序中的几十个地方这样做,这保证了将来时区会出现错误,除非我使用自定义字段类型(参见下面的示例)

引用:我知道pymongo支持在对象从数据库到达时将
tzinfo
放到对象上。我也知道我自己可以做到这一点,正如下面的示例所示。
DateTimeTZField
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 CODECODEOPTIONS使其全局应用于所有DateTimeFields:从数据库加载时,它们应该附加tzinfo?

我的理解是mongoengine不支持每种型号的
编解码器选项
。如果有,它们应该是
opts
字典的一部分

但是,当集合没有自己的选项时,PyMongo默认为数据库的
编解码器选项
,您可以在向DB发出任何请求之前,通过手动调用应用程序中的
注册连接
来设置这些选项

在上面的示例中,您应该像下面这样传递
codec\u选项

with_timezone = CodecOptions()
connect(host="mongodb://localhost/datetimewithtz", codec_options=with_timezone)
怎么样

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

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

谢谢您深思熟虑的回答,我会在尝试后回来。我将实例化CodecOptions(tz_aware=True),如果不正确,请告诉我。