首页 > 解决方案 > 如何从 Django Rest Framework 序列化程序返回不同时区的 DateTime

问题描述

DateTimeField在 Django Rest Framework 中使用任意时区返回某些 Django 模型的 pythonic 方式是什么?

目前,我的视图以 UTC 格式返回 DateTime,因为据我所知,Django 将时区感知的日期时间存储为 UTC 时区中的日期时间。

楷模:

class TimezoneMixin(models.Model):
    TIMEZONES = [(i, i) for i in country_timezones['ru']]

    timezone = models.CharField(choices=TIMEZONES, ...)

    class Meta:
        abstract = True

    def get_timezone(self):
        if self.timezone:
            return timezone(self.timezone)
        return get_current_timezone()


class Organization(TimezoneMixin, models.Model):
    ...

class Event(models.Model):
    organization = models.ForeignKey(Organization, ...)
    date_created = models.DateTimeField(auto_now_add=True, ...)
    ...

序列化器:

class EventSerializer(serializers.ModelSerializer):

    class Meta:
        model = Event
        fields = ('organization', 'date_created', ...)

在 ViewSet 中,我按如下方式填充数据

organization_id = ...  # Some logic to get required organization_id

data = {
    'date_created': timezone.now(), # django.utils.timezone
    'organization': organization_id,
    ...
}

serializer = EventSerializer(data=data)
if serializer.is_valid():
    serializer.save()
    response_data = serializer.data.copy()
    # Some logic to rename one of the keys in response data
    ...
    return Response(response_data, ...)  # rest_framework.response.Response

即使我timezone.now()用类似的东西替换,timezone.now().astimezone(organization.get_timezone())我仍然会收到 UTC DateTime 作为响应。

我是否正确,从 解析date_created字符串,从中response_data创建 DateTime 对象,转换为不同的时区并在视图末尾再次格式化为字符串不是一个好主意?还有哪些方法?

标签: pythondjangodatetimedjango-rest-frameworktimezone

解决方案


您需要localtime()获取当前时区的时间,因为now()无论TIME_ZONE.

您可以将任意时区传递给本地时间:

localtime(timezone='SOMETHING')

推荐阅读