基于日期w / Django ORM查询值 [英] query for values based on date w/ Django ORM

查看:113
本文介绍了基于日期w / Django ORM查询值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一堆具有值和日期字段的对象:

  obj1 = Obj(date ='2009 -8-20',value = 10)
obj2 = Obj(date ='2009-8-21',value = 15)
obj3 = Obj(date ='2009-8-23'值= 8)

我想要返回:

  [10,15,0,8] 

或更好,总共到达这一点:

  [10,25,25,33] 

我最好直接从数据库获取此数据,但否则我可以很容易地使用for / p>

我正在使用Django的ORM和Postgres



编辑:



只是要注意,我的例子只涵盖了几天,但在实践中,我有几百个对象覆盖了几十年...我正在做的是创建一个线图,显示所有对象的总和随着时间的推移而增长(很长一段时间)

解决方案

这个没有测试,因为设置一个Django表来测试是有点太痛苦:

  from datetime import date,timedelta 
#http://www.ianlewis.org/en/python-date-range-iterator
def datetimeRange(from_date,to_date = None):
而to_date是None或from_date< = to_date:
yield from_date
from_date = from_date + timedelta(days = 1)

start = date(2009,8,20)
end = date(2009,8,23)
objects = Obj.objects.filter(date__gte = start)
objects = objects。过滤器(date__lte = end)

结果= {}
对象中的o:
结果[o.date] = o.value

返回[date.get(day,0)for day in datetimeRange(start,end)]

每天运行一个单独的查询。


I have a bunch of objects that have a value and a date field:

obj1 = Obj(date='2009-8-20', value=10)
obj2 = Obj(date='2009-8-21', value=15)
obj3 = Obj(date='2009-8-23', value=8)

I want this returned:

[10, 15, 0, 8]

or better yet, an aggregate of the total up to that point:

[10, 25, 25, 33]

I would be best to get this data directly from the database, but otherwise I can do the totaling pretty easily with a forloop.

I'm using Django's ORM and also Postgres

edit:

Just to note, that my example only covers a few days, but in practice, I have hundreds of objects covering a couple decades... What I'm trying to do is create a line graph showing how the sum of all my objects has grown over time (a very long time)

解决方案

This one isn't tested, since it's a bit too much of a pain to set up a Django table to test with:

from datetime import date, timedelta
# http://www.ianlewis.org/en/python-date-range-iterator
def datetimeRange(from_date, to_date=None):
    while to_date is None or from_date <= to_date:
        yield from_date
        from_date = from_date + timedelta(days = 1)

start = date(2009, 8, 20)
end = date(2009, 8, 23)
objects = Obj.objects.filter(date__gte=start)
objects = objects.filter(date__lte=end)

results = {}
for o in objects:
    results[o.date] = o.value

return [results.get(day, 0) for day in datetimeRange(start, end)]

This avoids running a separate query for every day.

这篇关于基于日期w / Django ORM查询值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆