首页 > 解决方案 > 如何仅将查询集的值转换为 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}]

我还在我的模板中做了一些循环,但我的想法是将大部分逻辑放到我的视图中,所以我更喜欢模板之外的代码。

有没有简单的方法可以做到这一点,还是我走错了路?很感谢任何形式的帮助。提前致谢。

标签: djangodjango-viewsdjango-queryset

解决方案


正如我从你的问题中得到的那样:[{'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 = {}

要将月份编号更改为月份名称,您需要创建一个转换器函数并替换该值


推荐阅读