У меня есть эти модели:Джанго и Часовые пояса: как сделать осведомленный DateTime как наивный один в шаблоне (с pytz)
class TimeZone(models.Model):
name = models.CharField(max_length = 40, unique = True, editable = False)
def tz(self):
return pytz.timezone(str(self.name))
class Place(models.Model):
name = models.CharField(max_length=200)
timezone = models.ForeignKey(TimeZone)
class PlaceAction(models.Model):
action_time = models.DateTimeField(blank=True, null=True)
place = models.ForeignKey(Place, related_name='Stop place')
def save(self, *args, **kwargs):
place_tz = self.place.timezone.tz()
if self.action_time:
self.action_time = place_tz.localize(self.action_time)
return super(PlaceAction, self).save(*args, **kwargs)
Моих пользователи вводят место и наивное DateTime в форме. У меня есть часовой пояс места в БД, так что я не требую часового пояса от моих пользователей. Я конвертирую и сохраняю это datetime как известное время в DB (я использую Postgres). Данные корректно сохраняются с правильным смещением.
Когда я хочу отображать данные (например, в форме обновления), Django преобразует его обратно в наивное datetime, но использует часовой пояс settings.py по умолчанию (TIME_ZONE = 'UTC'). Я хотел бы знать, как наилучшим образом преобразовать значение datetime в наивное, используя правильный часовой пояс (объект Place). Я предпочел бы преобразование на уровне модели вместо уровня шаблона (я использую JQueryUI для выбора даты и времени, а так как первое преобразование выполняется там, я предпочел бы обратное преобразование в одном и том же месте).
Некоторые из моих идей: В модели PlaceAction init()? С пользовательским менеджером?
Я не смог найти оптимальную практику в документах для обратного преобразования в другой часовой пояс, чем по умолчанию. Есть ли это?
По-видимому, в процессе разработки существует метод запроса. [здесь] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#datetimes) –
И чтобы получить правильное время в исходном часовом поясе: 'self.action_time.astimezone (place_tz) .replace (tzinfo = None) ' –
Ах да, конечно,' astimezone' должен закрывать DLS. Вы можете быть заинтересованы в https://github.com/mfogel/django-timezone-field для вашего поля часового пояса. Он проверяет на ptyz и возвращает объект ptyz.Timezone(). – rockingskier