pytest不会将日期字段转换为Django中的datetime.date对象

int*_*lis 7 python django pytest

我有这个用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
Run Code Online (Sandbox Code Playgroud)

当我使用Django的测试运行器运行测试时python manage.py test,我得到了预期的结果:

RESULTS:  <QuerySet [{'created_count': 14, 'sd': datetime.date(2017, 2, 24)}]>
Run Code Online (Sandbox Code Playgroud)

但当我这样做时pytest -s,我得到:

RESULTS:  <QuerySet [{'created_count': 14, 'sd': u'2017-02-24'}]>
Run Code Online (Sandbox Code Playgroud)

为什么pytest转换日期不像Django的测试运行器?

dap*_*azz 3

datetime.date()当我对 postgresql 数据库进行查询时,我得到了很好的行为,但是u'2017-02-24'当我对 SQLLite 数据库后端运行时,我得到了很好的行为,所以我预计问题是,无论出于何种原因,当您运行时,pytest您正在使用与以下数据库不同的数据库后端:当你从 逃跑时python manage.py test

更新(经过少量研究)

SQLLite没有本机日期时间数据类型,可以使用 TEXT、REAL 或 INTEGER 数据类型存储日期时间值。然后,您可以使用日期函数来根据需要显示日期。

特别是date()SQLLite 函数返回一个字符串,它实际上相当于strftime('%Y-%m-%d', ...). 所以我希望提供绑定的 python 库也能返回一个字符串。

然而,普通的 SQL/postgresql确实有本机日期时间类型。那里的函数date()返回一个日期对象。因此,处理这些数据库类型的 python 库也会返回一个datetime.date对象,这是有道理的。