Search code examples
djangodictionarydjango-modelsdjango-queryset

How to convert export Django QuerySet to one dictonary?


How to convert export Django QuerySet to one dictonary?

I want to insert Django QuerySet as data_source into DataTable for Bokeh

queryset = Model.objects.all()
qs = queryset.values()
qs = dict(qs)

header = [field.verbose_name for field in Model._meta.get_fields()]
columns = [TableColumn(field=col, title=col) for col in header]
source = ColumnDataSource(qs)
data_table = DataTable(source=source, columns=columns)

script, div = components(data_table)

 qs = dict(qs)
             ^^^^^^^^
    ValueError: dictionary update sequence element #0 has length 11; 2 is required

Solution

  • The qs is not a dictionary, it is a sequence of object values (Queryset Values). Hence you can cast it as dictionary, but you can cast it as list (which will be list of dictionaries):

    qs = list(qs)
    

    It is not enough to load in your database. You need to build the dictionary from that list:

    qs_dict = {}
    
    for item in qs:
        for field in Model._meta.get_fields():
            qs_dict[field.verbose_name] = qs_dict.get(field.verbose_name, []).append(item[field.name])
    
    source = ColumnDataSource(qs_dict)