0

我有这些模型:

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)

我的用户在表单中输入了一个地点和一个简单的日期时间。我已经在数据库中拥有该地点的时区,因此我不需要用户提供时区。我将此日期时间转换并保存为数据库中的可识别日期时间(我使用 Postgres)。数据以正确的偏移量正确保存。

当我想渲染数据时(例如以更新形式),Django 将其转换回一个简单的日期时间,但使用 settings.py 的默认时区(TIME_ZONE = 'UTC')。我想知道使用正确的时区(Place 对象之一)将感知日期时间转换回幼稚日期时间的最佳方法。我宁愿在模型级别而不是模板级别进行转换(我使用 JQueryUI 进行日期时间选择,由于第一次转换是在那里完成的,我宁愿在同一个地方进行反向转换)。

我的一些想法: 在模型中 PlaceAction init ()? 使用自定义管理器?

我在文档中找不到将反向转换为与默认时区不同的最佳实践。有吗?

4

2 回答 2

0

天真的日期时间是不知道时区的日期时间。要将时区感知的日期时间呈现为幼稚,您只需不显示时区。

“我想知道使用正确的时区将有意识的日期时间转换回天真的日期时间的最佳方法”

这句话简直没有任何意义。使用天真的日期时间,没有正确的时区。我怀疑你想要的是将日期转换为特定时区,从数据库给你的 UTC 日期时间。

正确的做法是在视图中。始终在内部保持 UTC,并且仅转换为显示。这就是最简单的方法。

于 2013-04-26T21:48:59.723 回答
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 %}
于 2013-04-25T16:18:54.717 回答