Я хочу установить .tzinfo каждого экземпляра datetime
автоматически, как только он выйдет из хранилища данных.
Итак, если у меня есть
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?
Я думаю, что лучший подход заключается в том, чтобы подклассифицировать класс 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__
, например, если вам нужно несколько разных атрибутов datetime для использования разных часовых поясов.
IMHO, это не лучший способ обработки часовых поясов в GAE. Из docs:
Если значение datetime имеет атрибут tzinfo, оно будет преобразовано в часовой пояс UTC для хранения. Значения возвращаются из хранилища данных как UTC, с tzinfo None. Приложению, которому нужны значения даты и времени в конкретном часовом поясе, необходимо правильно установить tzinfo при обновлении значения и преобразовать значения в часовой пояс при доступе к значению.
Итак,
auto_now
и auto_now_add
.pacific_time = utc_time.astimezone(Pacific_tzinfo())
date_from_user.replace(tzinfo=EST)