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

Posted

技术标签:

【中文标题】如何将 Django QuerySet 转换为字典列表?【英文标题】:How do I convert a Django QuerySet into list of dicts? 【发布时间】:2011-12-10 07:49:03 【问题描述】:

我还没有找到这个问题的答案,所以我想知道我是否缺少某种大家都使用的常见帮助函数。

【问题讨论】:

【参考方案1】:

使用.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 的实例,请使用list(Blog.objects.values(…))

【讨论】:

是的,您可以通过将 values() 作为参数传入来指定您希望返回的字段。也要小心,虽然它看起来像 values 返回一个字典列表,它实际上是一个 <class 'django.db.models.query.ValuesQuerySet'> 而不是一个列表。 这实际上并没有返回列表 另外,你不能用values()得到你的对象的实例方法的结果,我不知道有没有像values()一样的好方法,但也可以调用实例方法?! 这很难理解。什么是Blog,什么是object?看看每个的数据类型会很好。例如,哪个是 QuerySet?【参考方案2】:

.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

【讨论】:

或者您可以使用此list(result) 简化转换为列表【参考方案3】:

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

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

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

【讨论】:

我似乎已经开始使用 data = list( blogs )json.dumps( data )。一个数组在 javascript 端带有一堆对象,不需要解析。【参考方案4】:

类型转换到列表

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

    json.dumps(list(job_reports))

【讨论】:

【参考方案5】:

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

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

这些字典中的每一个都代表一个对象,带有键 对应模型对象的属性名。

【讨论】:

【参考方案6】:

您可以对从您进行查询的 Django 模型字段获得的 dict 使用 values() 方法,然后您可以通过索引值轻松访问每个字段。

这样称呼——

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

【讨论】:

【参考方案7】:

您需要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)

【讨论】:

【参考方案8】:

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

def queryset_to_list(qs,fields=None, exclude=None):
    my_list=[]
    for x in qs:
        my_list.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_list

假设您的模型具有以下字段

id
name
email

在 django shell 中运行以下命令

>>>qs=<yourmodel>.objects.all()
>>>list=queryset_to_dict(qs)
>>>list
['id':1, 'name':'abc', 'email':'abc@ab.co','id':2, 'name':'xyz', 'email':'xy@xy.co']

假设你只想要查询集字典列表中的 id 和 name

>>>qs=<yourmodel>.objects.all()
>>>list=queryset_to_dict(qs,fields=['id','name'])
>>>list
['id':1, 'name':'abc','id':2, 'name':'xyz']

同样,您可以在输出中排除字段。

【讨论】:

方法名具有欺骗性。它说 queryset_to_dict 但它返回一个数组! @TNT 我更改了方法名称。谢谢。 from django.forms.models import model_to_dict 这个工作做得很好,我们可以提高效率吗?【参考方案9】:

如果您已经有一个查询集,您只需使用 list 函数将其转换为 dicts 列表,例如:

list(MyModel.objects.values())

【讨论】:

【参考方案10】:

我是 python 新手,我喜欢 @David Wolever 答案

user = Blog.objects.all()
user = list(user.values("username", "id"))

在我的例子中,我用它来打印用户名

user = Blog.objects.all()
user = list(user.values("username"))
name = []
for i in user:
    name.append(i["username"])
print(name)
# ["joe", "karen", "stuf"]

【讨论】:

【参考方案11】:

简单地说list(yourQuerySet)

【讨论】:

这会给你一个对象列表,而不是一个字典列表。

以上是关于如何将 Django QuerySet 转换为字典列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Django QuerySet 转换为列表?

如何将列表转换为queryset django

如何将此 SQL 转换为 Django QuerySet?

在 Django 中将 QuerySet 转换为 JSON

将 Queryset 转换为带有 JSON 值的字典

Django:将带有相关对象的 QuerySet 转换为 JSON