【问题标题】:How to return list of django model instances as JSON?如何以 JSON 形式返回 Django 模型实例列表?
【发布时间】:2018-01-09 13:43:50
【问题描述】:

我有一个看法:

class ListUnseenFriendRequests(generics.GenericAPIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        friendship_requests_list = Friend.objects.unread_requests(user=request.user)
        friendship_requests_rough_json = [serializers.serialize('json', [obj]) for obj in friendship_requests_list]
        friendship_requests_json = [obj.strip("[]") for obj in friendship_requests_rough_json]
        return Response(friendship_requests_json, content_type="application/json")

这给了我以下 JSON 格式:

[
    "{\"model\": \"friendship.friendshiprequest\", \"pk\": 8, \"fields\": {\"from_user\": 6, \"to_user\": 4, \"message\": \"\", \"created\": \"2017-07-27T14:02:28.492Z\", \"rejected\": null, \"viewed\": null}}",
    "{\"model\": \"friendship.friendshiprequest\", \"pk\": 13, \"fields\": {\"from_user\": 2, \"to_user\": 4, \"message\": \"\", \"created\": \"2017-07-27T16:47:24.863Z\", \"rejected\": null, \"viewed\": null}}",
    "{\"model\": \"friendship.friendshiprequest\", \"pk\": 20, \"fields\": {\"from_user\": 14, \"to_user\": 4, \"message\": \"\", \"created\": \"2017-07-31T08:03:27.887Z\", \"rejected\": null, \"viewed\": null}}",
    "{\"model\": \"friendship.friendshiprequest\", \"pk\": 22, \"fields\": {\"from_user\": 22, \"to_user\": 4, \"message\": \"\", \"created\": \"2017-08-01T11:52:08.830Z\", \"rejected\": null, \"viewed\": null}}"
]

在 android 客户端向此视图发出请求时,会发生以下错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $[0]

我认为这意味着不应有任何 " 包装 JSON 响应。如果这是问题,我该如何删除它们?如果这不是问题,我该如何解决?

【问题讨论】:

  • 您可以改用JSONResponse。使用这个from django.http import JsonResponse 然后return JSONResponse(friendship_requests_json)
  • 发生完全相同的错误。响应格式没有区别。
  • 我验证了您在问题中输入的 json,它看起来是合法的。有什么问题?
  • 这是我的客户尝试处理响应时遇到的错误:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $[0]
  • 基本上我认为这意味着唯一不正确的响应是我问题中每一行的开头和结尾的 "。

标签: python json django-models django-views django-rest-framework


【解决方案1】:

更好的方法是为您的 Friend 模型创建一个序列化程序,并使用该序列化程序类将其转换为 JSON。 但是,如果您不想使用它,这将为您提供接近解决方案的方法

from django.http import JsonResponse
import json
class ListUnseenFriendRequests(generics.GenericAPIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        friendship_requests_list = json.loads(serializers.serialize('json',Friend.objects.unread_requests(user=request.user))
        return JSONResponse(friendship_requests_list,safe=False)

serializers.serialize 方法正在序列化 Django 对象并将它们转换为表示字符串。我们知道字符串应该是 JSON 表示,我们将字符串转换为 JSON,将其作为JSONResponse 发送。 参考this

【讨论】:

  • 使用 ListAPIView 怎么样?
  • @TomFinet 有很多方法可以做到这一点。我只是建议了您要实现的目标。
  • 我想理想地使用 ListAPIView
  • 响应与我开始的响应相同,只是在起始方括号 [ .
  • @TomFinet 您是否为 Friend 创建了序列化程序类?
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2018-01-09
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多