2016-11-15 2 views
0

Прежде всего, я очень новичок в мире Django, может возникнуть аналогичный вопрос, однако я не нашел удовлетворительного ответа.Django: отфильтровать несколько полей от ответа json

Вот мой сценарий, у меня мало внешних конечных точек REST, которые я удалю из своего приложения Django и скажу 100-клавишный ответ JSON. Теперь, когда я пишу свой API в приложении Django, этот ответ мне придется обрезать и отправить в внешний мир. Скажем, например, Мой API является,

GET /api/profiles/1472 

который даст профиль пользователя с идентификатором 1472. Теперь, этот API будет INTURN вызывать некоторые другие REST конечной точки и получить данные фактического профиля. Итак, в некотором смысле я пишу конечную точку прокси. Предполагается, что конечная точка прокси-сервера будет обрезать некоторые поля и вернуть их вызывающему абоненту.

Я не писал для этого классы моделей.

Каковы наилучшие способы достижения этого в Django?

Edit 1: вид образца будет так,

class GetCompetitorProductsView(APIView): 
    """ 
    Get Competitor products view 
    """ 

    def post(self, request, format=None): 
     # I'll be having a list of fields to be trimmed from response. 
     # It will be separate for every API. 
     data = request.data 

     error_checks = system_errors.check_for_competitor_products_input_error(data) 

     if not error_checks: 
      response = call_to_rest(data) 
      return Response(response) 
     else : 
      return Response(error_checks, status = status.HTTP_412_PRECONDITION_FAILED) 

И еще одно, такое же поведение применяется ко всем другим API. Поэтому мне нужно больше общего решения, которое можно легко применить к другим API.

+1

Вам не нужна модель для этого. Покажите нам свое видение –

+0

@SardorbekImomaliev добавил образец. Как я уже упоминал, мне нужно более общее решение, которое можно легко применить к другим API. Имейте в виду, у меня будет список полей, подлежащих обрезке для каждого API. –

ответ

0

В основном это, как фильтр в питона

allowed_fields = ("first_name", "last_name", "email") 
user_info = call_rest_endpoint(id=1472) 
result = {key:value for key,value in user_info.items() if key in allowed_fields} 

Первая линия определить, какие поля и хотят вернуться.

Вторая линия вызывает конечную точку и получает данные от их стороннего API.

Третья строка состоит из 3 заявлений.

  1. user_info.items() преобразовать словарь в массив ключей/значений paris.
  2. Сложение словарь из этих кортежей
  3. но только если ключ был найден в allowed_fields кортежа
+0

Спасибо @Ramast. Я не хочу писать один и тот же код снова и снова для каждого API. –

0

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

class TrimDataMixin(object): 
    ALLOWED_FIELDS = None 

    def trim_data(self, data): 
     allowed_fields = self.ALLOWED_FIELDS or [] 
     return {k: v for k, v in data.items() if k in allowed_fields} 


class GetCompetitorProductsView(TrimDataMixin, APIView): 
    """ 
    Get Competitor products view 
    """ 
    ALLOWED_FIELDS = ['first_name', 'last_name'] 

    def post(self, request, format=None): 
     # I'll be having a list of fields to be trimmed from response. 
     # It will be separate for every API. 
     data = request.data 

     error_checks = system_errors.check_for_competitor_products_input_error(data) 

     if not error_checks: 
      response = call_to_rest(data) 
      # trim data    
      response = self.trim_data(response) 
      return Response(response) 
     else: 
      return Response(error_checks, status = status.HTTP_412_PRECONDITION_FAILED) 
+0

Спасибо! Есть ли у Django некоторый способ фильтрации/сериализации? Наверное, более чистый способ? –

+0

@AashishP Вы можете сделать это с помощью сериализаторов. Но вам придется писать подобные вещи вручную. Существует несколько способов сделать это, но насколько они будут зависеть от того, как вы пишете свои взгляды. Например, если все ваши представления имеют одинаковые методы 'post'. Вы можете перенести этот метод в 'TrimDataMixin' и настроить этот' post' с переменными класса, как я сделал с 'ALLOWED_FIELDS' –

+0

Хорошо, я понял вашу мысль. Спасибо за ваши комментарии. –