我正在使用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')
总是感谢您的帮助:)
答案 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)
您需要混合使用TruncDate
,order_by
和itertools.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个以上实例,时间很好。