从数据存储区刷新后的Google应用引擎

时间:2010-01-18 22:44:24

标签: python google-app-engine

我想在数据存储区出来后立即自动设置每个datetime实例的.tzinfo。

所以,如果我有

class Message( db.Model ):
    creationTime = db.DateTimeProperty()
    someOtherTime = db.DateTimeProperty()

    ## I really want to define a method like this,
    ## that runs immediately AFTER an instance has
    ## been refreshed from the datastore
    def wakeup( self ): 
        self.creationTime.tzinfo = self.creationTime.replace( tzinfo=EST )
        self.someOtherTime.tzinfo = self.creationTime.replace( tzinfo=EST )

是否可以在GAE中执行此操作?

2 个答案:

答案 0 :(得分:2)

我认为最好的方法是让你继承 DateTimeProperty类并覆盖其方法make_value_from_datastore

class EstDateTimeProperty(db.DateTimeProperty):
  def make_value_from_datastore(self, value):
    naive_utc = db.DateTimeProperty(self, value)
    aware_utc = naive_utc.replace(tzinfo=UTC)
    return aware_utc.astimezone(EST)

给出合适的tzinfo对象UTC和EST当然(由pytz或其他)构建。当然,您还可以构建一个更通用的“智能日期时间”属性类,并让它从__init__中的关键字参数设置感兴趣的时区,例如,如果您需要多个不同的日期时间属性来使用不同的时区。

答案 1 :(得分:1)

恕我直言,这不是处理GAE时区的最佳方式。来自docs

  

如果datetime值具有tzinfo属性,则它将转换为UTC时区进行存储。值从数据存储区返回UTC,tzinfo为None。需要日期和时间值在特定时区的应用程序必须在更新值时正确设置tzinfo,并在访问值时将值转换为时区。

所以,

  1. 处理创建日期或上次修改日期use auto_now and auto_now_add arguments
  2. 要向用户显示日期,请将其转换为like this pacific_time = utc_time.astimezone(Pacific_tzinfo())
  3. 更新数据存储区时,请使用替换功能设置tzinfo属性:date_from_user.replace(tzinfo=EST)