2015-07-25 2 views
-1

Я пытаюсь реализовать эту схему:POST новый вложенный объект

http://127.0.0.1:8000/api/get_work/

{ 
    "type": "dns", 
    "source_alerts": [ 
     { 
      "source": "alehop.com", 
      "alerts": [ 
       { 
        "dns_server": "8.8.4.4", 
        "ip_addr": "134.211.190.5", 
       }, 
       { 
        "dns_server": "7.7.2.2", 
        "ip_addr": "224.110.70.3", 
       } 
      ] 
     } 
    ] 
} 

А потом быть в состоянии получить все предупреждения вложенные в источник:

** Источник будет быть уникальным

http://127.0.0.1:8000/api/set_work/dns/alehop.com/

 "alerts": [ 
      { 
       "dns_server": "8.8.4.4", 
       "ip_addr": "134.211.190.5", 
      }, 
      { 
       "dns_server": "7.7.2.2", 
       "ip_addr": "224.110.70.3", 
      } 

И ПОСТ одно предупреждение в этот источник:

 { 
      "dns_server": "7.7.2.2", 
      "ip_addr": "224.110.70.3", 
     } 

Мой вопрос: можно реализовать список/создать Viewset маршрута с параметрами?

router.register(r'set_work/(?P<type>.+)/(?P<source>.+)', views.SetWorkViewSet) 

В этом случае, как я могу использовать эти параметры в представлении, чтобы отфильтровать запрос?

Заранее спасибо. Любые другие подходы очень приветствуются, я очень новичок в python/django.

ответ

0

Уверен, что вы можете!

Django REST Framework (DRF) для просмотра моделей (который, как я полагаю, вы используете) реализует стандартные методы get_object и get_queryset. Так как вы добавили дополнительные параметры в URL-адрес регулярное выражение, вы можете ссылаться на них через self.kwargs внутри режима просмотра:

def get_queryset(self): 
    qs = super(...).get_queryset() 
    return qs.filter(type=self.kwargs['type'], source=self.kwargs['source']) 

Это будет делать фильтрацию, которая сделает list работы. Что касается create, вам, вероятно, потребуется настроить сериализатор, чтобы использовать значения из kwargs url. Есть несколько способов сделать это:

  1. добавить URL-адрес kwargs в данных, передается сериализатору при инстанцировании его

    class MyViewSet(ViewSet): 
        def get_serializer(self, *args, **kwargs): 
         # add the url kwargs to request data so that serializer will see it 
         self.request.data.update(self.kwargs) 
         return super(...).get_serializer(*args, **kwargs) 
    

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

  2. настроить логику проверки в сериализаторе добавить параметры URL

    class MySerializer(ModelSerializer): 
        class Meta(object): 
         model = MyModel 
        def to_internal_value(self, data): 
         if hasattr(self, 'internal_data') and 'view' in self.context: 
          data.update(self.context['view'].kwargs) 
         return super(...).to_internal_value(data) 
    

    Я лично считаю этот подход чище, даже если она просачивается немного информации о к режиму просмотра сериализатору.

Обратите внимание, что код не проверен, поэтому вам нужно будет провести некоторое тестирование, но оно должно вас начать.

+0

Awesome @ miki725. Я попробую прямо сейчас. Большое спасибо! – Porter

Смежные вопросы