Конвертировать часовой пояс на Sqlalchemy get () - PullRequest
0 голосов
/ 28 декабря 2018

Я возиться с часовыми поясами в приложении Flask, используя Sqlalchemy (с Postgres).Postgres сохраняет дату и время как временные метки с часовым поясом, и все даты и время хранятся в UTC по умолчанию.Использование библиотеки маятника Python легко конвертировать в разные часовые пояса.

У меня есть простая модель на основе sqlalchemy:

class Order(Model): 
    id = Column(Integer, primary_key=True)
    code = Column(String(10))
    order_date = Column(DateTime(timezone=True))

Я хотел бы преобразовать order_date из Order - идентифицируемого order_id - в часовой пояс пользователяпо запросу.Я могу сделать (я предполагаю, user.timezone является действительным часовым поясом):

order = db.session.query(id, 
                         code,
                         func.timezone(user.timezone, Order.order_date).label('order_date'))\
          .filter(Order.id == order_id)\
          .first()

, но иногда проще просто get Order:

order = Order.query.get(order_id)

В этомпоследним способом я получаю сохраненный UTC order_date.Можно преобразовать order_date с помощью функции get?

Мой обходной путь - get объект, пройти через поля модели (при условии, что в реальных случаях объект может иметь более одногополе datetime) и, если поле имеет значение datetime, преобразуйте его в часовой пояс пользователя следующим образом:

import datetime
import pendulum

def convert_tz(obj, tz):
    for each in obj.__dict__:
        d = getattr(obj, each)
        if isinstance(d, datetime.datetime):
            setattr(obj, each, tz.convert(d))

order = Order.query.get(order_id)
tz = pendulum.timezone(user.timezone)
convert_tz(order, tz)

Кажется, что работает, но также выглядит слишком запутанным.Есть ли способ лучше?Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...