Как DRF возвращает список элементов из стороннего API? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть конечная точка, где мне нужно сделать запрос к стороннему API, чтобы получить список элементов и вернуть результаты клиенту.

Какой из следующих или любой другой подход лучше подходит для DRF?

  1. Выполните проверку входного параметра и вызов стороннего API и в методе view передайте список элементов в ответе сериализатору для сериализации и верните данные сериализатора клиенту
  2. Передать параметры запроса в сериализатор как поля только для записи, выполнить проверку поля, вызов API и сериализацию в сериализаторе
  3. Смесь 1 и 2; использовать 2 разных сериализатора, один из которых принимает параметры запроса в качестве полей только для записи, проверяет входные параметры и отправляет запрос в сторонние API, а другой сериализатор принимает полученный список из первого сериализатора и сериализует элементы для использования клиентом

1 Ответ

0 голосов
/ 10 сентября 2018

Поскольку в вашем вопросе ничего не говорится о записи данных в БД , несомненно, вы можете перейти к методу-1.

Давайте рассмотрим этот пример API , который возвращает список элементов (список API).

Case - 1 : Нам нужно показать тот же ответ, который мы получили от стороннего API
В этом случае нам не нужен сериализатор или процесс сериализации, все, что нам нужно, это передать данные от стороннего API клиенту.

from rest_framework.decorators import api_view
from rest_framework.response import Response
import requests


@api_view()
def my_view(request):
    tp_api = "https://jsonplaceholder.typicode.com/posts"
    response = requests.get(tp_api)
    return Response(data=response.json())


Дело - 2 : если вам не нужны полные данные, но мало частей (id и body)
В этой конкретной ситуации вы можете использовать питоническую петлю или сериализатор DRF.

<b># using DRF serializer</b>
from rest_framework import serializers


# serializer class
class Myserializer(serializers.Serializer):
    id = serializers.CharField()
    body = serializers.CharField()


@api_view()
def my_view(request):
    tp_api = "https://jsonplaceholder.typicode.com/posts"
    response_data = requests.get(tp_api).json()
    my_serializer = Myserializer(data=response_data, many=True)
    my_serializer.is_valid(True)
    return Response(data=my_serializer.data)

<b>#Python loop way</b>
@api_view()
def my_view(request):
    tp_api = "https://jsonplaceholder.typicode.com/posts"
    response_data = requests.get(tp_api).json()
    data = [{"id": res['id'], "body": res['body']} for res in response_data]
    return Response(data=data)


В case-2 я бы рекомендовал использовать сериализатор DRF, который выполняет множество функций, таких как проверка и т. Д.


При втором подходе проверка входных данных будет зависеть от ваших требований. Как вы сказали в комментариях, вам нужно предоставить некоторые входные данные для стороннего API. Таким образом, проверка должна должна быть выполнена перед доступом к стороннему API


# Validation example
class MyInputSerializer(serializers.Serializer):
    postId = serializers.IntegerField(max_value=10)


class MyOutputSerializer(serializers.Serializer):
    id = serializers.CharField()
    body = serializers.CharField()


@api_view()
def my_view(request):
    input = MyInputSerializer(data=request.GET)
    input.is_valid(True)
    tp_api = "https://jsonplaceholder.typicode.com/comments?postId={}".format(input.data['postId'])
    response_data = requests.get(tp_api).json()
    my_serializer = MyOutputSerializer(data=response_data, many=True)
    my_serializer.is_valid(True)
    return Response(data=my_serializer.data)



Заключение * * тысяча пятьдесят-одна DRF гибкий достаточно для получения желаемого выходного формата, а также для ввода данных в систему. Короче говоря, все зависит от ваших требований

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...