Django按日期返回对象注释组

时间:2019-06-22 05:17:30

标签: python django django-models

我正在使用aggregate doc中的Django的chart.dataSource.events.on("parseended", function(event) { // Original demo originally has 19 data items, ranging from 1994 through 2012, // this should set it to 1999 through 2008: event.target.data = event.target.data.slice(5,15); });

我的目标是按日期对模型进行分组,并以这种形式返回与每个日期关联的所有对象:

def graph(request):
    register_matplotlib_converters()
    dates_in_string = ['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04', '2010-01-21']
   dates_datetime = []
   m = pd.date_range('2015-07-03', '2015-07-20')
print(m)
for d in dates_in_string:
    dates_datetime.append(datetime.datetime.strptime(d, '%Y-%m-%d'))
dates_float = matplotlib.dates.date2num(dates_datetime)
list1 = [0,0,1,4,5,6,3,44,4,6,3,4,5,6,7,8,9,4]
plt.grid(True)
plt.plot_date(m, list1, linestyle='-', tz=None, xdate=True, ydate=False, label="chat-clicks")
plt.title("Chat click Analysis")
plt.ylabel("Chat clicks")
plt.xlabel("Day")
plt.legend(loc='upper left')
# for i,j in zip(m,list1):
#     plt.annotate(str(j),xy=(i,j))
mplcursors.cursor(hover=True)
plt.savefig("graph.png")
# plt.show()
figfile = BytesIO()
plt.savefig(figfile, format='png', dpi=300)
figfile.seek(0)
figdata_png = base64.b64encode(figfile.getvalue()).decode('utf-8').replace('\n', '')
figfile.close()
result = figdata_png
return render(request,'graph.html', {"result":result})

我尝试了以下查询:

annotate

但这返回了我指定的[{ 'date': datetime.datetime(2019, 6, 22, 11, 35), 'instances': [<Model: (1)>, <Model: (2)> ] }, { 'date': datetime.datetime(2019, 6, 21, 11, 35), 'instances': [<Model: (3)>, <Model: (6)> ] },]

Flight.objects.values('origin_scheduled_dep').annotate(Count('origin_scheduled_dep')).order_by('origin_scheduled_dep')

总是感谢您的帮助:)

3 个答案:

答案 0 :(得分:3)

您可以使用TruncDate这样操作:

from django.db.models.functions import TruncDate

Flight.objects.annotate(date=TruncDate('origin_scheduled_dep')).values('date').annotate(count=Count('date')).order_by('date')

仅供参考::如果您使用的是MySQL,并且使用了django的时区支持,请使用mysql_tzinfo_to_sql将时区表加载到MySQL数据库(reference)中。 SO answer可能对此有所帮助。


更新

我认为仅使用django queryset函数无法实现您的预​​期结果。因此,我认为您需要使用一些python函数来实现它,例如:

from collections import defaultdict  
results = defaultdict(list)

queryset = Flight.objects.annotate(date=TruncDate('origin_scheduled_dep')).order_by('date')

for flight in queryset:
    results[flight.date].append(flight)

for key, value in results.items():
     print(key,value)

或者您可以使用regroup模板标记显示层次结构列表。

答案 1 :(得分:3)

您需要混合使用TruncDateorder_byitertools.groupby

from itertools import groupby
from operator import attrgetter

queryset = Flight.objects.annotate(
   date=TruncDate('origin_scheduled_dep'),
).order_by('date')
grouped = [
    {'date': date, 'instances': instances}
    for date, instances in itertools.groupby(
       queryset.iterator(), attrgetter('date')
    )
]

答案 2 :(得分:0)

我认为它会根据您的需要运行,但我认为这不是解决问题的最佳方法

from django.db.models import Count

times = Flight.objects.values_list('origin_scheduled_dep', flat=True).annotate(Count('origin_scheduled_dep'))
my_list = []

for time in times:
    my_list.append({'date': time, 'instances': Flight.objects.filter(origin_scheduled_dep=time)})

我尝试使用Django ORM做到这一点,但我做不到 所以我 对330000个数据集进行了测试,该数据集包含820个重复值,并且其中一些值包含2200个以上实例,时间很好。