将Unix时间戳记接受为整数并转换为DateTimeField以保存在Django中

问题描述 投票:1回答:1

我有一个Travel模型,需要像邮递员一样从外部接受Unix值,然后转换为DateTimeField来保存数据

class MyModel:
    class Meta:
        abstract = True
    def ToDateTime(self,timestamp):
        date=datetime.fromtimestamp(timestamp)
        return date
Travel(MyModel):
    departure_at = models.DateTimeField()
    arrival_at  = models.DateTimeField()

Serializer

class TravelSerializer(serializers.ModelSerializer):
    departure_at=serializers.DateTimeField(write_only= True)
    arrival_at=serializers.DateTimeField(write_only= True) 
class Meta:
        model=Travel
        fields = ('departure_at','arrival_at')
    def validate(self, attrs):
        attrs = self.add_departure_at(attrs)
        attrs = self.add_arrival_at(attrs)
        return attrs 
    def add_departure_at(self,attrs):
        departure_at=attrs['departure_at']
        obj=BaseModel()
        todate=obj.ToDateTime(int(arrival_at))
        return todate

邮递员数据

{
    "departure_at": "1585750708",
    "arrival_at"  : "1585664308",
}

但是在这里我得到这个错误

{
    "departure_at": [
        "Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]."
    ],
    "arrival_at": [
        "Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]."
    ]
}

如何解决此错误?

python django django-rest-framework datetime-format unix-timestamp
1个回答
0
投票

使用IntegerField代替DateTimeField

from datetime import datetime


class TravelSerializer(serializers.ModelSerializer):
    departure_at = serializers.IntegerField(write_only=True)
    arrival_at = serializers.IntegerField(write_only=True)

    def validate_departure_at(self, value):
        return datetime.fromtimestamp(value)

    def validate_arrival_at(self, value):
        return datetime.fromtimestamp(value)

    class Meta:
        model = Travel
        fields = ('departure_at', 'arrival_at')

示例:

payload = {
    "departure_at": 1585750708,
    "arrival_at": 1585664308,
}
s = TravelSerializer(data=payload)
s.is_valid(True)
print(s.validated_data)
© www.soinside.com 2019 - 2024. All rights reserved.