Я возиться с часовыми поясами в приложении 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)
Кажется, что работает, но также выглядит слишком запутанным.Есть ли способ лучше?Спасибо