Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Django Rest框架序列化程序返回不同时区的DateTime_Python_Django_Datetime_Django Rest Framework_Timezone - Fatal编程技术网

Python 如何从Django Rest框架序列化程序返回不同时区的DateTime

Python 如何从Django Rest框架序列化程序返回不同时区的DateTime,python,django,datetime,django-rest-framework,timezone,Python,Django,Datetime,Django Rest Framework,Timezone,在Django Rest框架中使用任意时区返回某些Django模型的DateTimeField的pythonic方法是什么 目前,我的视图返回UTC的日期时间,因为据我所知,Django将时区感知的日期时间存储为UTC时区的日期时间 型号: class TimezoneMixin(models.Model): TIMEZONES = [(i, i) for i in country_timezones['ru']] timezone = models.CharField(cho

在Django Rest框架中使用任意时区返回某些Django模型的
DateTimeField
的pythonic方法是什么

目前,我的视图返回UTC的日期时间,因为据我所知,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', ...)
在视图集中,我按如下方式填充数据

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\u timezone())
的内容,我仍然会收到UTC日期时间的响应

我是否正确地认为,从
response\u data
解析
date\u created
字符串,从中创建DateTime对象,转换为不同的时区,并在视图末尾再次格式化为字符串不是一个好主意?其他方法是什么?

您需要获取当前时区中的时间,因为
now()
将始终返回UTC时间,而不管
时区的值如何

您可以将任意时区传递给localtime:

localtime(timezone='SOMETHING')

我能够在任意时区获得时间戳,而无需解析datetime字符串,因为
序列化程序
提供了对保存的
实例
的访问。下面是我的解决方案

response_data = serializer.data.copy()
# Some logic to rename one of the keys in response data
...
event_date_created_utc = serializer.instance.date_created
# Basically calls get_timezone on Organization instance and returns the result
organization_timezone = get_timezone_by_organization_id(organization_id)
response_data['date_created'] = timezone.localtime(event_date_created_utc,
                                                   timezone=organization_timezone).isoformat()
return Response(response_data, ...)  # rest_framework.response.Response

感谢Edgar R.Mondragón提到
localtime()
及其用法。

序列化程序使用默认时区,您可以在settings.py文件中设置该时区

如果要为一个字段设置时区

import pytz
class WeatherReportSerializer(serializers.ModelSerializer):
    DatetimeValue = serializers.DateTimeField(default_timezone=pytz.timezone('Asia/Kolkata'))
    
    class Meta:
        model = ...
        fields = [..., ..., ...]

最明智的方法是在任何地方都使用时区感知或UTC,并且只在显示时间转换为本地时区。datetimes可以同时使用时区感知和UTC,我错了吗?它们可以(
timezone.now()
is)。然后他们意识到自己是UTC。理想情况下,API应该是UTC。显示时间为向最终用户显示时的时间。例如,在JS代码中,您可以在浏览器中查询用户的时区并相应显示。-在API中包含本地时间只会让开发人员混淆它到底是哪个时区(它是否取决于服务器位置?是否为UTC?是否根据某些用户设置进行设置?是否尝试使用geoip检测客户端时区?如果我通过代理怎么办?)谢谢您的建议。我还更愿意使用基于UTC的API作为用户。然而,由于当前API客户端的限制,我需要在不同的时区发送响应。听起来几乎像我需要的。你能推荐一下它的位置吗?我已尝试将此逻辑放入我的自定义
序列化程序。序列化程序的类似于数据的属性。但在自定义属性的情况下,datetime不会像在vanilla
serializer.data
中那样自动转换(序列化?)为字符串。还不知道为什么。