将 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 值的字典的主要内容,如果未能解决你的问题,请参考以下文章