DRF - СериализаторMethodField - PullRequest
0 голосов
/ 01 июля 2019

У меня API-интерфейс, как показано ниже: -

class ProfileAPI(generics.RetrieveAPIView):
    serializer_class = ProfileSerializer

    def get_object(self):
        try:
            return Profile.objects.get(user=self.request.user)
        except:
            return None
            # I don't raise NotFound here for a reason.
            # I don't want a 404 response here, but a custom HTML response, explained below.



class ProfileSerializer(serializers.ModelSerializer):

    html = serializers.SerializerMethodField()

    def get_html(self, obj):
        # some custom HTML response based on whether the user obj is `None` or not.
        if not obj:
            return NOT_LOGGED_IN_HTML

        return CUSTOM_HTML

    class Meta(object):
        model = Profile
        fields = ('html',)

Теперь, когда пользователь вошел в систему, я получил ключ html в ответе. Тем не менее, когда пользователь None (вышли из системы), я получаю пустой ответ. Зачем? и как я могу это исправить?

1 Ответ

1 голос
/ 01 июля 2019

Насколько я понимаю из реализации метода retrieve и data, вам нужно передатьэкземпляр Profile для заполнения данных.Я хотел бы подойти так:

class ProfileAPI(generics.RetrieveAPIView):
    serializer_class = ProfileSerializer

    def get_object(self):
        try:
            return Profile.objects.get(user=self.request.user)
        except:
            return <b>Profile()</b>  # empty object instance


class ProfileSerializer(serializers.ModelSerializer):

    html = serializers.SerializerMethodField()

    def get_html(self, obj):
        <b>if obj and obj.pk:
            return CUSTOM_HTML
        return NOT_LOGGED_IN_HTML</b>       

    class Meta(object):
        model = Profile
        fields = ('html',)
...