将日期时间序列化为整数时间戳

2024-04-24 08:49:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望django rest在序列化时不要将DateTime模型字段转换为字符串日期表达式。

response_date = serializers.DateTimeField(source="updated_at")

我希望这个能像

1411880508

而不是

"2014-09-28T05:01:48.123"


Tags: django字符串模型restsourcedatetimedate序列化
3条回答
REST_FRAMEWORK = {
    # if you want with milliseconds or
    'DATETIME_FORMAT': '%s.%f', 
    # only with seconds
    'DATETIME_FORMAT': '%s', 
}

休息的结果是

1)1517863184.666435

2)1517863249

我没能让汤姆的榜样起作用,而且这些价值观似乎没有被修改。然而,它给了我一个起点,经过一番阅读,我找到了一种方法来产生预期的结果:

[方法1]

序列化程序.py

import time

class TimestampField(serializers.Field):
    def to_representation(self, value):
        return int(time.mktime(value.timetuple()))

class MySerializer(serializers.ModelSerializer):
    ts = TimestampField(source="my_fieldname") #Source must be a models.DateTimeField

    class Meta:
        model = myModel
        fields = ('id', 'ts')

JSON输出:

[{
    "id": 1,
    "ts": 1475894303
},
{
    "id": 2,
    "ts": 1475833070 
}]

[方法2]

Tom的解释和前面提到的方法显然更符合维护标准(因为结果实际上是整数类型的)。

然而,一个快速而肮脏的解决方案是指定format parameter for the DateTimeField并将其设置为以秒为单位显示值。

请注意,这可能无法在Windows计算机上正常工作! 并可能导致值错误:无效的格式字符串

要进行测试,只需在序列化程序字段中包含“format”关键字参数,如下所示:

序列化程序.py

class MySerializer(serializers.ModelSerializer):    
    timestamp = serializers.DateTimeField(format="%s")

    class Meta:
        model = myModel
        fields = ('id', 'ts')

JSON输出:

[{
    "id": 1,
    "ts": "1475890361"
},
{
    "id": 2,
    "ts": "1475833070"
}]

此外,还可以包括微秒:

timestamp = serializers.DateTimeField(format="%s.%f")

如果要在您自己的解释器中测试功能(以验证您的操作系统是否支持%s参数),请复制以下行:

import datetime
print datetime.datetime.now().strftime('%s') #datetime formatted as seconds for REST

import time  #This is just for confirmation
print time.mktime(datetime.datetime.now().timetuple()) #time object result as float

我觉得这个方法与OPs问题有点不一致,因为结果实际上不是integer类型,而是integer/float的字符串表示,REST会在值周围加引号。

你要写一个custom serializer field,就像这样:

class TimestampField(serializers.Field):
    def to_native(self, value):
        epoch = datetime.datetime(1970,1,1)
        return int((value - epoch).total_seconds())

为了支持写操作,您需要从WritableField继承并实现from_native()

相关问题 更多 >