django - 如何仅将查询集的值转换为 django 中的新字典数组
问题描述
我想以一种有效的方式将数据从我的视图传递到我的模板。具体来说,我需要一个内部带有 dict 的数组,如下所示:
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() 方法,它破坏了我的计数方法。我也尝试将其放入这样的列表中:
list(UrlTime.objects.annotate(month=ExtractMonth('timestamp')).values('month').annotate(c=Count('id')))
(这可行,但给了我一个包含键和数组字典的列表,如下所示:[{'month': 5, 'c': 313}, {'month': 6, 'c': 1962}]
我还在我的模板中做了一些循环,但我的想法是将大部分逻辑放到我的视图中,所以我更喜欢模板之外的代码。
有没有简单的方法可以做到这一点,还是我走错了路?很感谢任何形式的帮助。提前致谢。
解决方案
正如我从你的问题中得到的那样:[{'month': 5, 'c': 313}, {'month': 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 = {}
要将月份编号更改为月份名称,您需要创建一个转换器函数并替换该值