Использовать существующий ModelSerializer с JSONResponse - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть вид аутентификации Twitter, который не использует набор настроек, поэтому аутентификация может быть обработана на бэкэнде. Представление принимает oauth_token и использует Twython для получения профиля и создания модели Twitter.

В настоящее время я просто возвращаю статус 201 в случае успеха, но чтобы устранить необходимость в другом запросе после создания, яхотел бы вернуть созданную модель. У меня уже есть TwitterSerializer, который определяет fields, который я хочу включить, поэтому я хотел бы иметь возможность использовать его, если это возможно.

TwitterSerializer

class TwitterSerializer(serializers.ModelSerializer):

    class Meta:
        model = Twitter
        fields = (
            "id",
            "twitter_user_id",
            "screen_name",
            "display_name",
            "profile_image_url",
        )

Когда я пытаюсь использовать это, я получаю ошибку, что Instance of TwitterSerializer is not JSON serializable.

            serialized = TwitterSerializer(instance=twitter)
            return JsonResponse({ "created": serialized })

Я могу вернуть сериализованный экземпляр модели, используя serializers.serialize()

            serialized = serializers.serialize('json', [twitter, ])
            serialized = serialized[0]
            return JsonResponse({ "created": serialized })

Я мог бы передать fields kwarg serialize(), но я не хочу повторяться, если не буду этого делать. Так можно ли будет повторно использовать мой TwitterSerializer в этом случае? У меня проблемы с поиском прямого ответа, так как в большинстве документов предполагается, что вы будете использовать ViewSet при использовании сериализатора по понятным причинам, и это похоже на крайний случай. Я также открыт для предложений по рефакторингу этого подхода!

1 Ответ

1 голос
/ 04 ноября 2019

После сериализации вы можете получить свои данные, используя data атрибут сериализатора, подобный этому.

serialized = TwitterSerializer(instance=twitter)
return JsonResponse({ "created": serialized.data })

Вы должны использовать Django rest Response вместо JsonResponse, как это

from rest_framework response
serialized = TwitterSerializer(instance=twitter)
return response.Response({ "created": serialized.data })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...