在python

时间:2019-07-13 07:49:59

标签: python type-conversion timezone

我正在尝试将"2019-07-17T16:00:50.282203+01:30"格式的字符串转换为时区格式,以便我可以更新models.DateTimeField字段。

models.py:

from django.utils import timezone

class task(models.Model):
       title = models.CharField(max_length=100)
       create_date = models.DateTimeField(default=timezone.now)
       .
       .
       .

请求将如下所示:

{
    "title": "editeddd task",
    "create_date" : "2019-07-17T16:00:50.282203+01:30"

}

被困在转换UTC部分中。

view.py:

.
.
.
create_date = datetime.strptime(self.request.data['expiration_date'], '%Y-%m-%dT%H:%M:%S.%f%z')
.
.

‍错误是%z部分的错误。它可以转换"2019-07-17T16:00:50.282203+0130"但不能转换"2019-07-17T16:00:50.282203+01:30"(在UTC部分通知:

2 个答案:

答案 0 :(得分:1)

发送时要严格,接收时要宽容,您应该在将create_date字符串传递给strptime之前对其进行一点字符串处理。

我的建议是使用正则表达式,或者查看rreplace - How to replace the last occurrence of an expression in a string?以摆脱最后的:

希望这会有所帮助!

答案 1 :(得分:1)

在引用request.data时,好像您正在使用Django REST Framework。在这种情况下,最直接的方法是使用DRF的序列化器来解析/验证传入的数据。

from rest_framework import serializers

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ('title', 'create_date')

如果您只想检索经过验证的数据,则可以执行以下操作:

>>> serializer = TaskSerializer(data=request.data)
>>> serializer.is_valid(raise_exception=True)
>>> serializer.validated_data
OrderedDict([('title', 'editeddd task'), ('create_date', datetime.datetime(2019, 7, 17, 14, 30, 50, 282203, tzinfo=<UTC>))])

或者如果您要保存新任务:

task = serializer.save()

重要的是要验证所有传入的数据并通过进入request.POSTrequest.data容易出错的方法来手动验证每个字段。 DRF的序列化器(或Django的形式)具有许多预先构建的逻辑,使任务明显更容易,更安全。