如何将Django QuerySet转换为dicts列表?

时间:2011-10-18 17:52:59

标签: python django

如何将Django QuerySet转换为dicts列表?我还没有找到答案,所以我想知道我是否错过了每个人都使用的某种常见助手功能。

9 个答案:

答案 0 :(得分:121)

使用.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

答案 1 :(得分:23)

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

但如果您愿意,可以使用Python列表理解将ValuesQuerySet转换为本机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

答案 2 :(得分:8)

如果由于某种原因需要本机数据类型(例如JSON序列化),这是我的快速' n'肮脏的方式:

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

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

答案 3 :(得分:3)

您没有准确定义字典应该是什么样子,但很可能您指的是QuerySet.values()。来自official django documentation

  

返回ValuesQuerySet - 返回的QuerySet子类   用作可迭代的字典而不是模型实例   对象。

     

每个词典都代表一个带有键的对象   对应于模型对象的属性名称。

答案 4 :(得分:0)

您可以在您进行查询的Django模型字段中使用的dict上使用>>> "Spam".casefold() 'spam' >>> s = "EggS" >>> s.casefold() 'eggs' >>> s == "eggs" False >>> s.casefold() == "eggs" True 方法,然后您可以通过索引值轻松访问每个字段。

这样称呼它 -

values()

答案 5 :(得分:0)

只需放置list(yourQuerySet)

答案 6 :(得分:0)

您需要DjangoJSONEncoderlist才能将Queryset改成json,参考:Python JSON serialize a Decimal object

import json
from django.core.serializers.json import DjangoJSONEncoder


blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)

答案 7 :(得分:0)

键入投射到列表

    job_reports = JobReport.objects.filter(job_id=job_id, status=1)..values('id', 'name')

    json.dumps(list(job_reports))

答案 8 :(得分: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