Python 测试时如何将DateTime转换为Django/DRF中的字符串

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

我正在测试一个端点,它自然地返回一个JSON,其中包含作为字符串的日期时间

我比较了测试中的响应内容,如下所示:

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"),
}