我在 Django 中编写了这个简单的查询我想用 pytest 运行我的测试.
results = (self.base_query
.order_by('service_date')
.extra({'sd': "date(service_date)"})
.values('sd')
.annotate(created_count=Sum('pax_number')))
print 'RESULTS: ', results
当我使用 Django 的测试运行程序运行测试时:python manage.py test
,我得到了预期的结果:
RESULTS: <QuerySet [{'created_count': 14, 'sd': datetime.date(2017, 2, 24)}]>
但是当我使用 pytest -s
时,我得到:
RESULTS: <QuerySet [{'created_count': 14, 'sd': u'2017-02-24'}]>
为什么 pytest 不像 Django 的测试运行器那样转换日期?
最佳答案
当我对 postgresql 数据库进行查询时,我得到了很好的 datetime.date()
行为,但是运行时的 u'2017-02-24'
行为针对 SQLLite 数据库后端,所以我预计问题是无论出于何种原因,当您使用 pytest
运行时,您使用的数据库后端与您从 python manage.py 运行时不同测试
。
更新(经过一些研究)
SQLLite does not have native 日期时间数据类型,并且可以使用 TEXT、REAL 或 INTEGER 数据类型存储日期时间值。然后你使用 date functions根据需要显示您的日期。
特别是 date()
SQLLite 函数返回一个字符串,这实际上等同于 strftime('%Y-%m-%d' , ...)
。所以我希望提供绑定(bind)的 python 库也能返回一个字符串。
但是普通 SQL/postgresql does have native date time types . date()
函数返回一个日期对象。因此,处理这些数据库类型的 python 库也将返回一个 datetime.date
对象是有道理的。
关于python - pytest 不会将日期字段转换为 Django 中的 datetime.date 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42665416/