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

Mri*_*lla 98 python django

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

Dav*_*ver 141

使用.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'}]
Run Code Online (Sandbox Code Playgroud)

注意:结果QuerySet主要表现为列表,但实际上并不是实例list.使用list(Blog.objects.values(…))如果你真的需要的一个实例list.

  • 是的,您通过将它们作为参数传递来指定您希望`values()`返回哪些字段.另外要小心,虽然看起来值会返回一个dicts列表,它实际上是一个`<class'django.db.models.query.ValuesQuerySet'>`而不是列表. (6认同)
  • 这实际上并没有返回列表 (6认同)

Art*_*bun 27

.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
Run Code Online (Sandbox Code Playgroud)

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

actual_result = some_function()
expected_result = {
    # dictionary content here ...
}
assert expected_result == actual_result
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以使用这个`list(result)`简化转换到列表 (11认同)

Sem*_*mel 11

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

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Run Code Online (Sandbox Code Playgroud)

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


Sau*_*tel 10

类型投射到列表

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

    json.dumps(list(job_reports))
Run Code Online (Sandbox Code Playgroud)


gao*_*idf 6

您需要DjangoJSONEncoder并使list您的Queryset参考jsonPython JSON 序列化 Decimal 对象

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


blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
Run Code Online (Sandbox Code Playgroud)