Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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 DRF使DateTimeField不考虑默认时区_Python_Django_Datetime_Serialization_Django Rest Framework - Fatal编程技术网

Python DRF使DateTimeField不考虑默认时区

Python DRF使DateTimeField不考虑默认时区,python,django,datetime,serialization,django-rest-framework,Python,Django,Datetime,Serialization,Django Rest Framework,默认时区为时区='America/Chicago'和使用时区=假 在请求数据中,我有time字段,其值如下: '2017-04-05T14:42:52.472+05:00' 当我这样做的时候: serializer = self.get_serializer(data=data) if serializer.is_valid(): ... 该时间字段在已验证的\u数据中转换为该数据: 2017-04-05 09:42:52.472000 也就是说,它让时间变得天真。但是,它不考虑我

默认时区为
时区='America/Chicago'
使用时区=假

在请求数据中,我有
time
字段,其值如下:

'2017-04-05T14:42:52.472+05:00'
当我这样做的时候:

serializer = self.get_serializer(data=data)
if serializer.is_valid():
    ...
该时间字段在
已验证的\u数据中转换为该数据:

2017-04-05 09:42:52.472000
也就是说,它让时间变得天真。但是,它不考虑我的默认时区。我希望它首先将时间转换为芝加哥时间,然后再将其简单化为:

2017-04-05 04:42:52.875000
就像
django.utils.timezone.make_naive()
的工作原理一样

我通过使用
使你变得天真
来解决这个问题。然而,我认为这不是一个好的解决方案

序列化程序:

class LocationSerializer(serializers.ModelSerializer):
    time = UnixTimestampField()

    class Meta:
        model = Location
        fields = (
            'latitude',
            'longitude',
            'time'
        )

    def validate(self, attrs):
        user = self.context['request'].user
        if user.is_authenticated():
            attrs['tracking_id'] = user.tracking.id
            attrs['device_id'] = user.current_device.id
        return attrs
UnixTimestampField:

class UnixTimestampField(serializers.DateTimeField):
    def to_representation(self, value):
        if not value:
            return value

        return int(value.timestamp())

这是DRF的默认行为吗?解决这个问题的正确方法是什么?

所以我认为你对时间戳的含义理解错误

2017-04-05T14:42:52.472+05:00
此时间戳表示zulu前5小时。因此,转换后的时间戳为:

2017-04-05 09:42:52.472000
已转换为UTC,此时间戳与UTC中的时间戳类似。 虽然时间戳是幼稚的,但它也是UTC,所以我不认为这是正确的 这本身就是一个问题

但是,它不考虑我的默认时区。我希望它会 首先将时间转换为芝加哥时间,然后使其简单化:

2017-04-05 04:42:52.875000
我相信这也是一种误解。原始时间戳,通过
+05:00
指示了它相对于哪个时区。你当地的时区不应该和它有任何关系


通常,处理时间戳的正确方法是尽快将其转换为UTC。然后尽可能长时间地保持UTC,并且仅在向用户显示时将其转换回时区表示形式。如果它们必须以时间偏移量存储,那么您开始使用的格式是一个不错的选择。

您能在这里编写序列化程序类吗?@MohammadMustaqeem发布了它什么是
UnixTimestampField
?它是从哪里进口的?@MohammadMustaqeem也发布了它。它只是从
DateTimeField
继承,并覆盖
到_表示
,感谢您的澄清!