如何将Django QuerySet转换为字典列表?我没有找到答案,所以我想知道我是否缺少每个人都使用的某种通用帮助函数。
如何将Django QuerySet转换为字典列表?我没有找到答案,所以我想知道我是否缺少每个人都使用的某种通用帮助函数。
Answers:
使用.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
。
values()
,我不知道是否有一个好的方法values()
可以与调用实例方法一样来做?
该.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_result
和actual_result
必须是同一类型(例如字典)。
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
您没有完全定义字典的外观,但很可能是您所指的QuerySet.values()
。从官方的django文档中:
返回一个
ValuesQuerySet
—QuerySet
子类,该子类在用作可迭代对象(而不是模型实例对象)时返回字典。这些词典中的每一个都代表一个对象,其键对应于模型对象的属性名称。
输入类型到列表
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
你需要DjangoJSONEncoder
和list
使您Queryset
到json
,参考:Python的JSON序列化一个小数对象
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
values()
可以通过将其作为参数传递来指定要返回的字段。也要小心,尽管看起来值返回的是其实际a的字典列表<class 'django.db.models.query.ValuesQuerySet'>
而不是列表。