我有这些模特:
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)
我的用户在表单中输入了一个地点和一个天真的日期时间。 我已经在DB中拥有该地点的时区,因此我不需要用户的时区。我将此日期时间转换并保存为DB中的识别日期时间(我使用Postgres)。 使用正确的偏移量正确保存数据。
当我想渲染数据时(例如以更新形式),Django将其转换回天真的日期时间,但使用settings.py的默认时区(TIME_ZONE ='UTC')。 我想知道使用正确的时区(Place对象之一)将知晓日期时间转换回天真时间的最佳方法。我宁愿在模型级而不是模板级进行转换(我使用JQueryUI进行日期时间选择,因为第一次转换是在那里完成的,我宁愿在同一个地方进行反向转换。)
我的一些想法: 在模型PlaceAction init ()? 有自定义经理吗?
我无法在文档中找到最佳做法,以便反向转换为与默认时区不同的时区。有吗?
答案 0 :(得分:0)
您可以向PlaceAction
添加转换为天真的方法,然后在模板中使用该方法。
class PlaceAction(models.Model):
action_time = models.DateTimeField(blank=True, null=True)
place = models.ForeignKey(Place, related_name='Stop place')
def naive_action_time (self):
"""action_time but without the timezone :-)
"""
# Updated from Renaud Milon's comment
return self.action_time.astimezone(place_tz).replace(tzinfo=None)
{% place_action.naive_action_time %}
答案 1 :(得分:0)
天真的日期时间是一个不知道时区的日期时间。要将时区感知日期时间渲染为天真,您只需显示时区。
“我想了解转换知晓日期时间的最佳方法 天真的,使用正确的时区“
这句话根本没有任何意义。由于天真的日期时间,没有正确的时区。我怀疑你想要的是从数据库给你的UTC日期时间将日期转换为特定的时区。
在视图中,正确的地方是这样做的。始终在内部保持UTC,并仅转换为显示。这是简单的方法。