如何仅将查询集的值转换为Django中的新字典数组

时间:2019-06-19 07:22:00

标签: django django-views django-queryset

我想以有效的方式将数据从视图传递到模板。具体来说,我需要一个包含字典的数组,如下所示:

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}]

我还在模板中进行了一些循环,但是我的想法是将大多数逻辑放入视图中,因此我更喜欢模板之外的代码。

有没有简单的方法可以做到这一点,或者我走错了路?很感谢任何形式的帮助。预先感谢。

2 个答案:

答案 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