Django使用EPOCH时间休息框架更新时间

use*_*926 5 django django-rest-framework

我需要采用一个在EPOCH中具有字段"starttime"的表单并将其转换为

  1. python datetime
  2. fieldname ="created"

当我有:

models.py

class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True

    class Meta:
        ordering = ('created',)
Run Code Online (Sandbox Code Playgroud)

serializers.py

import time
class SnippetSerializer(serializers.ModelSerializer):
    starttime  = serializers.SerializerMethodField('epoch')

    def epoch(self, obj):
        """ Return epoch time for a datetime object or ``None``"""
        try:
            return int(time.mktime(obj.created.timetuple()))
        except (AttributeError, TypeError):
            return None

    class Meta:
        model = Snippet
        fields = ('starttime')
Run Code Online (Sandbox Code Playgroud)

如果我:

"GET"/ snippets/1 /

{"id":1,'starttime':13232111}

我希望能够做到:

"POST"/ snippets/1/{"id":1,'starttime':1}

{"id":1,'starttime':1}

现在,它只是忽略了请求.我被迫使用unix纪元时间来符合现有的API.

Kev*_*one 18

要与重写编写自己的串行现场子类to_native(),并from_native()针对实际的转换.这是我的尝试:

class UnixEpochDateField(serializers.DateTimeField):
    def to_native(self, value):
        """ Return epoch time for a datetime object or ``None``"""
        import time
        try:
            return int(time.mktime(value.timetuple()))
        except (AttributeError, TypeError):
            return None

    def from_native(self, value):
        import datetime
        return datetime.datetime.fromtimestamp(int(value))
Run Code Online (Sandbox Code Playgroud)

然后在Serializer定义中使用该字段:

class SnippetSerializer(serializers.ModelSerializer):
    starttime  = UnixEpochDateField(source='created')
Run Code Online (Sandbox Code Playgroud)

  • 确实如此,是的. (3认同)

小智 14

适应Django Rest Framework 3的Kevin Stone代码:

class UnixEpochDateField(serializers.DateTimeField):
    def to_representation(self, value):
        """ Return epoch time for a datetime object or ``None``"""
        import time
        try:
            return int(time.mktime(value.timetuple()))
        except (AttributeError, TypeError):
            return None

    def to_internal_value(self, value):
        import datetime
        return datetime.datetime.fromtimestamp(int(value))
Run Code Online (Sandbox Code Playgroud)