如何将密钥添加到我的DRF API响应值

时间:2019-05-03 16:26:25

标签: python-2.7 django-rest-framework

我的API仅返回值。我相信这是我的错,但是对于Python / Django来说不是很通用。任何帮助表示赞赏。

返回的内容

"This is the message"

我想要的

{
    "message": "This is a message"
}

我要做的就是添加一个单词作为key

views.py

from rest_framework.response import Response

from id.models import Id
from rest_framework import generics
from id.serializers import IdSerializer
from django.http import Http404
from IPython import embed


class OfferView(generics.RetrieveAPIView):
    serializer_class = IdSerializer
    lookup_field = 'id'

    def get_queryset(self):
        id = self.kwargs['id']
        try:
            return Id.objects.filter(id=id)
        except Mamo.DoesNotExist:
            raise Http404

    def get(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        serializer = self.serializer_class(queryset, many=True)
        try:
            if serializer.data[0]['offer_id'] is not None:
                result = serializer.data[0]['main_offer']
            elif serializer.data[0]['offer_id'] is None:
                result = serializer.data[0]['extra_offer']
            else:
                result = serializer.data[0]['exceptional_offer']
            return Response(result)
        except IndexError:
            raise Http404

2 个答案:

答案 0 :(得分:1)

只是改变

  

注意:问题就是您将要得到的形式,只是返回了string,这就是问题所在。现在,让我们将其转换为字典(更确切地说是REST中的JSON)。

     

serializer.data 是字典。您可以形成一个包含所需键和值(可序列化JSON)的单个字典。在这里,我只是试图满足需求。

result = serializer.data[0]['exceptional_offer']

result = {"message": serializer.data[0]['exceptional_offer']}

和其他类似的东西。

更好的方式:

只需更改以下内容(最后几行,我的意思是try...except

try:
    if serializer.data[0]['offer_id'] is not None:
        result = serializer.data[0]['main_offer']
    elif serializer.data[0]['offer_id'] is None:
        result = serializer.data[0]['extra_offer']
    else:
        result = serializer.data[0]['exceptional_offer']
    return Response(result)
except IndexError:
    raise Http404

转到下一个(写相同的代码就像重复代码一样。)

try:
    if serializer.data[0]['offer_id'] is not None:
        # result = serializer.data[0]['main_offer']
        key = 'main_offer'
    elif serializer.data[0]['offer_id'] is None:
        # result = serializer.data[0]['extra_offer']  
        key = 'extra_offer'
    else:
        # result = serializer.data[0]['exceptional_offer']
        key = 'exceptional_offer'

    result = {'message': serializer.data[0][key]}
    return Response(result)
except IndexError:
    raise Http404

答案 1 :(得分:0)

因此,我发现只是返回Public而不创建JSON对象。

result条件下将result = {'message': serializer.data[0]…}添加到所有变量result可以为我解决。