Google App Engine после обновления из хранилища данных - PullRequest
1 голос
/ 19 января 2010

Я хочу установить .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?

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Я думаю, что лучший способ для вас - подкласс 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 или как угодно). Конечно, вы могли бы также создать более общий класс свойств «smart datetime» и позволить ему устанавливать интересующий часовой пояс из аргумента ключевого слова в его __init__, например, если вам нужно несколько различных атрибутов datetime для использования разных часовых поясов.

1 голос
/ 19 января 2010

ИМХО, это не лучший способ обработки часовых поясов в GAE. Из документов :

Если значение datetime имеет атрибут tzinfo, оно будет преобразовано в часовой пояс UTC для хранения. Значения возвращаются из хранилища данных как UTC с tzinfo None. Приложение, которому требуются значения даты и времени в определенном часовом поясе, должно корректно устанавливать tzinfo при обновлении значения и преобразовывать значения в часовой пояс при доступе к значению.

Итак,

  1. Чтобы обработать даты создания или даты последнего изменения, использует auto_now и auto_now_add аргументы .
  2. Для отображения дат пользователям, конвертируйте их вот так pacific_time = utc_time.astimezone(Pacific_tzinfo())
  3. При обновлении хранилища данных установите атрибут tzinfo, используя функцию замены: date_from_user.replace(tzinfo=EST)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...