我尝试使用djangos orm执行查询,该查询返回某个部分在特定时间段内使用的许可证数量。 我使用django 1.8.3和python 2.7.6以及mysql作为数据库。
我的查询与此类似:
beg = datetime.date(2015, 9, 1)
end = datetime.date(2015, 9, 9)
LicenseUsage.objects.all().filter(datestamp__range=[beg, end])\
.values('datestamp')\
.filter(groupid__in=[301, 274, 155, 186])\
.filter(poolid=301)\
.annotate(used=Sum('usedamount'))\
.order_by('datestamp')
结果包含datestamp和usedamount
[{'datestamp': datetime.date(2015, 9, 1), 'used': 2},
{'datestamp': datetime.date(2015, 9, 2), 'used': 1},
{'datestamp': datetime.date(2015, 9, 3), 'used': 2},
{'datestamp': datetime.date(2015, 9, 4), 'used': 2},
{'datestamp': datetime.date(2015, 9, 5), 'used': 1},
{'datestamp': datetime.date(2015, 9, 7), 'used': 2}, # <-- where is the 6.?
{'datestamp': datetime.date(2015, 9, 8), 'used': 2},
{'datestamp': datetime.date(2015, 9, 9), 'used': 1}])
我的问题是,如果某个部分在某一天没有使用许可证,我的查询也不会返回任何内容。 即我的结果中的2015年9月6日。
我想预先形成一个返回
的查询[{'datestamp': datetime.date(2015, 9, 1), 'used': 2},
{'datestamp': datetime.date(2015, 9, 2), 'used': 1},
{'datestamp': datetime.date(2015, 9, 3), 'used': 2},
{'datestamp': datetime.date(2015, 9, 4), 'used': 2},
{'datestamp': datetime.date(2015, 9, 5), 'used': 1},
{'datestamp': datetime.date(2015, 9, 6), 'used': 0}, # <--- This is what i want
{'datestamp': datetime.date(2015, 9, 7), 'used': 2},
{'datestamp': datetime.date(2015, 9, 8), 'used': 2},
{'datestamp': datetime.date(2015, 9, 9), 'used': 1}])
我尝试过Coalesce
LicenseUsage.objects.all().filter(datestamp__range=[beg, end])\
.values('datestamp')\
.filter(groupid__in=[301, 274, 155, 186])\
.filter(poolid=301)\
.annotate(used=Coalesce(Sum('usedamount'), V(0)))\
.order_by('datestamp')
但结果是一样的,似乎我没有做对。 有人知道djangos orm是否可以进行这种查询,是否有可能如何解决? 会感激一些帮助,因为这让我疯了。
提前致谢。
BigZ