我正在尝试将"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部分通知:
)
答案 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.POST
或request.data
容易出错的方法来手动验证每个字段。 DRF的序列化器(或Django的形式)具有许多预先构建的逻辑,使任务明显更容易,更安全。