Django 将查询集序列化为 JSON 以仅使用字段信息和 id 构造 RESTful 响应
Posted
技术标签:
【中文标题】Django 将查询集序列化为 JSON 以仅使用字段信息和 id 构造 RESTful 响应【英文标题】:Django Serialize Queryset to JSON to construct RESTful response with only field information and id 【发布时间】:2013-01-04 02:11:06 【问题描述】:我目前有一个带有“标题”和“摘要”字段的帖子模型。我正在检索所有帖子并将它们作为 JSON 作为 RESTful API 接口的一部分返回。
这是基本方法
from django.core import serializers
def list_posts(request):
posts = Post.objects.filter(owner=authenticated_user)
serialized = serializers.serialize("json", posts, fields=('title', 'summary'))
return HttpResponse(serialized, mimetype='application/json')
当我访问相应的路线时,我得到了以下响应。
当前反应
["pk": 4, "model": "api.post", "fields": "summary": "Testing", "title": "My Test", "pk": 5, "model": "api.post", "fields": "summary": "testing again", "title": "Another test"]
这在技术上包含我的客户端构建模型所需的所有信息(我正在使用 Backbone 并且可以使用 collection.parse 来构建我需要的东西,但服务器端应该负责很好地构建响应)。对此我感到困扰的是,它看起来不像我习惯于在信誉良好的 API 中看到的标准 API 响应。我认为像下面这样的 JSON 响应会更“标准”。
期望的响应
['summary': 'Testing', 'id': 4, 'title': 'My test', 'summary': 'My Test', 'id':5, 'title': 'Another test']
serialize 的输出似乎不太适合以 JSON 格式返回模型实例集合作为 API 调用的响应,这似乎是一种相当普遍的需求。我想将字段信息与 id (或 pk,如果必须称为 pk)一起返回。
【问题讨论】:
查看tastypie 项目。它提供了一种方便的方式来将 API 添加到您的 Django 模型,并将序列化以输出更像您所期望的那样。 我最终花了几个小时将 sweetpie 集成到我的 API 中并对其进行试验,然后切换到更适合我的项目需求的 Django REST Framework。 IMO 更加灵活且有据可查。 Tastypie 对于某些应用程序来说仍然是一个很好的建议和一个很好的 REST 框架。谢谢。 【参考方案1】:您想要实现的是转储到 json 的字段子集。
您正在做的是序列化整个 django 的 ORM 对象。不好。
保持简单:
import json
posts = (Post.objects.filter(owner=authenticated_user)
.values('id', 'title', 'summary'))
json_posts = json.dumps(list(posts))
【讨论】:
啊,posts 是一个 Django ValueQuerySet,它在迭代时返回字典。这个没试过,不过好像很有用。这是否会失去使用 Django 序列化程序自动序列化所有字段类型的优势?我认为 json.dumps 在 DateTimeField 和其他字段上打嗝,但我还没有尝试过这个。 为此,我的朋友,请使用Django REST Framework。 将查询集转换为 JSON 对象列表、向每个 JSON 对象添加新字段并在响应中返回新列表的好方法是什么? @DivijSehgal django-rest-framework.org/api-guide/viewsets/#modelviewset @KrzysztofSzularz 是这样做的 :) 再次感谢 :)以上是关于Django 将查询集序列化为 JSON 以仅使用字段信息和 id 构造 RESTful 响应的主要内容,如果未能解决你的问题,请参考以下文章