问题:如何将Django QuerySet转换为字典列表?
如何将Django QuerySet转换为字典列表?我没有找到答案,所以我想知道我是否缺少每个人都使用的某种通用帮助函数。
回答 0
使用.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
该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
回答 2
如果出于某种原因(例如JSON序列化)而需要本机数据类型,这是我的快速“ n”处理方式:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
如您所见,在列表中构建字典并不是真正的DRY,所以如果有人知道更好的方法…
回答 3
您没有完全定义字典的外观,但很可能是您所指的QuerySet.values()
。从官方的django文档中:
返回一个
ValuesQuerySet
—QuerySet
子类,该子类在用作可迭代对象(而不是模型实例对象)时返回字典。这些词典中的每一个都代表一个对象,其键对应于模型对象的属性名称。
回答 4
输入类型到列表
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
回答 5
您可以values()
在查询所依据的Django模型字段中使用dict上的方法,然后可以通过索引值轻松访问每个字段。
这样称呼它-
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
回答 6
你需要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)
回答 7
简单地说list(yourQuerySet)
。
回答 8
您可以使用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