Python 测试时如何将DateTime转换为Django/DRF中的字符串
我正在测试一个端点,它自然地返回一个JSON,其中包含作为字符串的日期时间 我比较了测试中的响应内容,如下所示:Python 测试时如何将DateTime转换为Django/DRF中的字符串,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在测试一个端点,它自然地返回一个JSON,其中包含作为字符串的日期时间 我比较了测试中的响应内容,如下所示: assert serializer\u instance.data=={ “created_at”:str(model_instance.created_at), “updated_at”:str(model_instance.updated_at), } 在处创建和在处更新肯定是datetime字段s。但是,在这种情况下,测试失败的原因是: E Differing
assert serializer\u instance.data=={
“created_at”:str(model_instance.created_at),
“updated_at”:str(model_instance.updated_at),
}
在
处创建和在处更新肯定是datetime字段
s。但是,在这种情况下,测试失败的原因是:
E Differing items:
E {'created_at': '2020-06-24T12:42:03.578207+03:00'} != {'created_at': '2020-06-24 09:42:03.578207+00:00'}
E {'updated_at': '2020-06-24T12:42:03.578231+03:00'} != {'updated_at': '2020-06-24 09:42:03.578231+00:00'}
因此,str
对日期时间使用不同的格式。当然,可以使用strftime
成功地通过测试用例,但是应该有一个内部函数,可以在Django或Django Rest框架中轻松地完成测试,我想学习一下
提前谢谢
环境
- Python 3.8.3
- Django 2.2.12
- Django Rest框架3.11.0
myDate.strftime('%m/%d/%Y')
或
我找到了一条路。它使用方法,而不是使用str
转换模型实例上的datetime
字段,我认为两者最好都保持为datetime
来自django.utils.dateparse导入parse\u datetime的
data=序列化程序\实例.data
data[“created_at”]=parse_datetime(data[“created_at”])
# ... 还有其他人。。。
断言数据=={
#…还有其他人。。。
“created_at”:model_instance.created_at,
#…还有其他人。。。
}
虽然这没有问题,但我们可以像这样对serializer\u instance.data
进行变异。不过,我认为在测试中不会出现问题。对于我通常使用的DRF
obj.ts_updated.astimezone(timezone(settings.TIME_ZONE)).isoformat()
这与DRF格式相匹配。对于Django Rest Framework 3.11.0,您可以使用以下帮助函数将Python datetime对象转换为DRF使用的字符串表示形式:
from pytz import timezone as pytz_timezone
def convert_datetime_to_drf_str(date_time: datetime) -> str:
return date_time.astimezone(pytz_timezone(settings.TIME_ZONE)).isoformat().replace("+00:00", "Z")
因此,对于您的具体情况,它将是:
assert serializer_instance.data == {
"created_at": convert_datetime_to_drf_str(model_instance.created_at),
"updated_at": convert_datetime_to_drf_str(model_instance.updated_at),
}
或直接不使用辅助功能:
from pytz import timezone as pytz_timezone
assert serializer_instance.data == {
"created_at": model_instance.created_at.astimezone(pytz_timezone(settings.TIME_ZONE)).isoformat().replace("+00:00", "Z"),
"updated_at": model_instance.updated_at.astimezone(pytz_timezone(settings.TIME_ZONE)).isoformat().replace("+00:00", "Z"),
}
日期时间以字符串的形式来自DRF,格式类似于
2020-06-24T12:42:03.578207+03:00
。您的strftime
不包含此格式,最好使用Django和DRF中的内部函数,因为它们可能会根据Django的设置进行操作。
from pytz import timezone as pytz_timezone
assert serializer_instance.data == {
"created_at": model_instance.created_at.astimezone(pytz_timezone(settings.TIME_ZONE)).isoformat().replace("+00:00", "Z"),
"updated_at": model_instance.updated_at.astimezone(pytz_timezone(settings.TIME_ZONE)).isoformat().replace("+00:00", "Z"),
}