我想以有效的方式将数据从视图传递到模板。具体来说,我需要一个包含字典的数组,如下所示:
arraydict = [{key:value}, {key:value} ...]
现在这就是我要做的:
class VisualizationView(ListView):
template_name = 'visualize.html'
model = UrlTime
def get_context_data(self, **kwargs):
context = super(VisualizationView, self).get_context_data(**kwargs)
#Extracts the months and counts them
context['months'] = (UrlTime.objects.annotate(month=ExtractMonth('timestamp')).values('month').annotate(c=Count('id')))
这很重要。在我的django模板中打印我的{{month}}可以使我返回此查询集:
<QuerySet [{'month': 5, 'c': 313}, {'month': 6, 'c': 1961}]>
到目前为止,一切都很好。我的想法是使用d3.js可视化我的数据,为此我需要结构良好的数据。因此,我想将此查询集转换为:
data = [{5:313}, {6:1961}]
。基本上是创建一个查询集值的字典,然后将其放入数组中。
(最好是data = [{May:313}, {June:1961}]
)
我尝试了.values()方法,该方法破坏了count方法。我也尝试将其放入这样的列表中:
list(UrlTime.objects.annotate(month=ExtractMonth('timestamp')).values('month').annotate(c=Count('id')))
(此方法有效,但给了我一个包含键和数组的字典的列表,如下所示:[{'month': 5, 'c': 313}, {'month': 6, 'c': 1962}]
我还在模板中进行了一些循环,但是我的想法是将大多数逻辑放入视图中,因此我更喜欢模板之外的代码。
有没有简单的方法可以做到这一点,或者我走错了路?很感谢任何形式的帮助。预先感谢。
答案 0 :(得分:1)
我从您的问题中得到的答案是:[{'month':5,'c':313},{'month':6,6,'c':1962}],并且需要以下内容:[{5: 313},{6:1961}] 因此:
initial_data = [{'month': 5, 'c': 313}, {'month': 6, 'c': 1962}]
data = []
list_item ={}
for items in initial_data:
month = items['month']
count =items['c']
list_item[month] = count
data.append(list_item)
list_item = {}
要将月份编号更改为月份名称,您需要创建一个转换器函数并替换该值
答案 1 :(得分:1)
您可以像这样重构数据:
data = []
for item in the_list: #list is your initial datas format as python list
tmp_dict = {}
tmp_dict[item['month']] = item['c']
data.append(tmp_dict)
print(data)
对于日期,您有一个可以很好解释的主题:Get month name from number