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

Posted

技术标签:

【中文标题】将 Queryset 转换为带有 JSON 值的字典【英文标题】:Convert Queryset to dictionary with values for JSON 【发布时间】:2015-01-14 10:23:58 【问题描述】:

我编写了一个 Ajax 调用来返回演员姓名。除了序列化之外,一切正常。

型号

class ActorManager (models.Manager):
    def actor_like(self, query):
        actor_list = self.values('name', 'id').filter(name__icontains=query)
        # actor_list = self.filter(name__icontains=query) <-- this works. but I need 'values'
        return actor_list

view.py

def search(request, types, query):
    lists = Actor.objects.actor_like(query)
    data = serializers.serialize('json', lists)
    return HttpResponse(data, content_type='application/json')

以上抛出错误,

/search/actor/bal/ 处的 AttributeError

'dict' 对象没有属性 '_meta'

而模型查询“值”工作正常。以下工作正常,

actor_list = self.filter(name__icontains=query)

我需要“价值观”来减少数据传输。我怎样才能做到这一点?

请帮忙,提前谢谢。

【问题讨论】:

您不需要序列化查询集对象,只需将字典添加为 data['lists'] = 列表,您可以将列表用作模板中的对象。 Tanveer 是正确的,如果您正在使用 json 进行 ajax 调用,则序列化应该从您作为列表返回的查询集中自动完成。 Serializer.serialize 用于将整个查询集返回到 json,您可以将其传递回您的视图模板。 你们是对的。如果您添加了“答案”而不是 cmets,我会将您的答案标记为正确答案! 【参考方案1】:

serializers.serialize 仅适用于完整的查询集。但是values 返回一个dicts 容器,因此您或多或少可以将它直接传递给json.dumps - 您需要做的就是将容器本身转换为一个列表。

lists = Actor.objects.actor_like(query)
data = json.dumps(list(lists))

【讨论】:

如果字典包含小数怎么办? 定义一个json序列化器的子类,以默认方式转换日期时间、十进制等

以上是关于将 Queryset 转换为带有 JSON 值的字典的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 转换为 XML - 带有数组值的 Json

Django 将带有外键的查询集转换为 JSON

在 Django 中将 QuerySet 转换为 JSON

带有数组值的swift json字符串转换为[UInt8]

使用 Pandas 在巨大的 CSV 中解析带有嵌套值的 JSON 列

将 oracle.sql.TIMESTAMPTZ 转换为字符串值的问题