【问题标题】:Expecting JSON object instead of JSON Array期望 JSON 对象而不是 JSON 数组
【发布时间】:2020-08-03 08:04:24
【问题描述】:

在我使用数据库引擎 djongo 的 django 应用程序中,我试图通过从我的数据库中检索来返回 JSON 响应。但是,我收到的是 JSON 数组而不是 JSON 对象。目前,我的数据库中只有一条记录。请看下面的代码。

模型.py

class bloodDonors(models.Model):
location=models.CharField(max_length=20)
name=models.CharField(max_length=20)
phone=models.IntegerField()
address=models.TextField()
bloodGroup=models.CharField(max_length=5)
type=models.CharField(max_length=20)
def __str__(self):
    return self.name

views.py

class bloodDonersView(viewsets.ModelViewSet):
    queryset = bloodDonors.objects.all()
    serializer_class = bloodDonorsSerializer

JSON 响应:

[
    {
        "id": 3,
        "location": "Delhi",
        "name": "Tony",
        "phone": 888,
        "address": "South street",
        "bloodGroup": "B+",
        "type": "blood-donation"
    }
]

但是,实际上我需要如下回复:

{
    "id": 3,
    "location": "Delhi",
    "name": "Tony",
    "phone": 888,
    "address": "South street",
    "bloodGroup": "B+",
    "type": "blood-donation"
}

【问题讨论】:

  • 发送外部列表不是一个好主意:haacked.com/archive/2008/11/20/…
  • .all() 查询将始终返回一个数组或 djongo 调用的“查询集”,因为您的数据库可能有多个记录。因此,您需要迭代您的数组或显式提取该数组中的 JSON 对象。当你得到你的 JSON 数组时,遍历它(for 循环或 while 循环或迭代器)
  • 使用迭代器如何通过 JSON 响应发送数据?

标签: json django rest


【解决方案1】:

听起来您正在使用“列表”端点来检索与查询集匹配的所有对象,但您想使用详细信息retrieve 端点,您只检索一个对象。好消息是,因为您使用的是模型视图集,所以您可以免费获得一个详细信息 retrieve GET 端点。您所要做的就是将您想要的对象的pk 作为 url 的一部分传递,它只会返回您请求的单个对象。

所以如果你的网址当前是:

/api/v1/blood-donors

你想使用网址:

/api/v1/blood-donors/3

只获取您想要的单个对象(使用pk=3)。最后没有/{PK}GET 端点总是会返回一个列表,即使您的数据库中只有一个对象,如果您将pk 添加到url,您将始终只能返回一个对象, 与你传入的pk 匹配的对象。

更新以在评论中回答您的问题。新方法看起来像这样:

class bloodDonersView(viewsets.ModelViewSet):
    queryset = bloodDonors.objects.all()
    serializer_class = bloodDonorsSerializer

    @action(detail=False, methods=['get',], url_path='first')
    def get_first_object(self, request):
        object = bloodDonors.objects.first()
        serializer = bloodDonorsSerializer(object, many=False)
        return response.Response(serializer.data)

你要使用的网址是

api/v1/blood-donors/first

并且您需要查看有关在何处导入响应和操作装饰器的文档。

【讨论】:

  • 不使用pk,我们可以这样做吗?考虑到整个数据库中只有一个对象。
  • 不使用列表 API 端点。您可以通过使用many=False kwarg 调用序列化程序来编写仅返回单个对象的自定义端点。您基本上必须使用 @action 装饰器对其进行装饰,将详细信息设置为 False(这意味着它不需要 pk)并返回仅使用 many=False 传递给您的序列化程序的单个对象。
  • 您能详细说明一下这种技术吗?我无法关联任何关于此的文章。
  • 由于字符和格式限制,很难在评论中详细说明。这是一件奇怪的事情,如果数据库中只有一个对象,你不知道 pk 吗?如果数据库中有多个对象会发生什么 - 你会只有一个献血者吗?如果有多个行为应该是什么?你应该只拿第一个对象吗?还是最后一个?我不太明白你在这里要做什么,但我会更新我的答案,为你提供你想要选择数据库中第一个项目的端点(这将是你想要的,因为它是唯一的)。
  • 如果这对您有帮助,您能接受我的回答吗? (我更新以向您展示如何执行我建议您执行的操作)
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2018-03-06
  • 2017-12-16
  • 1970-01-01
相关资源
最近更新 更多