如何将Django QuerySet转换为字典列表?


122

如何将Django QuerySet转换为字典列表?我没有找到答案,所以我想知道我是否缺少每个人都使用的某种通用帮助函数。

Answers:


176

使用.values()方法:

>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]

注意:结果是,QuerySet其行为基本上类似于列表,但实际上不是的实例list。使用list(Blog.objects.values(…))如果你真的需要的一个实例list


7
是的,您values()可以通过将其作为参数传递来指定要返回的字段。也要小心,尽管看起来值返回的是其实际a的字典列表<class 'django.db.models.query.ValuesQuerySet'>而不是列表。
dm03514 2011年

10
但是,实际上并没有返回列表
astreltsov

另外,您无法使用来获得对象的实例方法的结果values(),我不知道是否有一个好的方法values()可以与调用实例方法一样来做?
Asara

34

.values()方法将返回类型的结果,ValuesQuerySet这通常是大多数情况下所需的。

但是,如果您愿意,可以ValuesQuerySet使用Python列表理解功能将其转换为本地Python列表,如下例所示。

result = Blog.objects.values()             # return ValuesQuerySet object
list_result = [entry for entry in result]  # converts ValuesQuerySet into Python list
return list_result

我发现上面的帮助,如果你正在编写单元测试,并需要断言函数的预期收益值,实际的返回值匹配,在这种情况下,两个expected_resultactual_result必须是同一类型(例如字典)。

actual_result = some_function()
expected_result = {
    # dictionary content here ...
}
assert expected_result == actual_result

17
或者,您可以使用此list(result)
选项

12

如果出于某种原因(例如JSON序列化)而需要本机数据类型,这是我的快速“ n”处理方式:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]

如您所见,在列表中构建字典并不是真正的DRY,所以如果有人知道更好的方法...


我似乎已经与它合作,data = list( blogs )然后json.dumps( data )。数组在javascript端带有一堆对象,不需要解析。
亚瑟·塔拉索夫

3

您没有完全定义字典的外观,但很可能是您所指的QuerySet.values()。从官方的django文档中

返回一个ValuesQuerySetQuerySet子类,该子类在用作可迭代对象(而不是模型实例对象)时返回字典。

这些词典中的每一个都代表一个对象,其键对应于模型对象的属性名称。



1

您可以values()在查询所依据的Django模型字段中使用dict上的方法,然后可以通过索引值轻松访问每个字段。

这样称呼它-

myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...



0

您可以使用model_to_dict定义一个函数,如下所示:

def queryset_to_dict(qs,fields=None, exclude=None):
    my_array=[]
    for x in qs:
        my_array.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_array
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.