Google App Engine после обновления из хранилища данных

1

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

Теги:
google-app-engine

2 ответа

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__, например, если вам нужно несколько разных атрибутов datetime для использования разных часовых поясов.

  • 0
    Точно правильный способ сделать это. :)
1

IMHO, это не лучший способ обработки часовых поясов в GAE. Из docs:

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

Итак,

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню