2015-07-25 5 views
-1

Je suis en train de mettre en œuvre ce programme:POST nouvel objet imbriqué

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", 
       } 
      ] 
     } 
    ] 
} 

Et puis être en mesure d'obtenir toutes les alertes imbriquées dans une source:

** La source sera être unique

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", 
      } 

Et POST une seule alerte dans cette source:

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

Ma question est: est possible de mettre en œuvre une liste/créer viewset d'un itinéraire avec des paramètres?

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

Dans ce cas, comment puis-je utiliser ces paramètres dans le Viewset pour filtrer le QuerySet?

Merci d'avance. Toutes les autres approches seront les bienvenues, je suis très nouveau sur python/django.

Répondre

0

Bien sûr, vous pouvez! DRF (Django REST Framework) pour les viewsets de modèles (que je suppose que vous utilisez) implémente les méthodes standard get_object et get_queryset. Depuis que vous avez ajouté des paramètres supplémentaires à la regex url, vous pouvez les référencer par self.kwargs à l'intérieur du viewset:

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

Cela fera le filtrage qui fera list travail. Comme pour le create, vous devrez probablement ajuster le sérialiseur afin d'utiliser les valeurs de l'url kwargs. Il y a deux façons de le faire:

  1. ajouter les kwargs d'URL pour les données passées à la sérialiseur lors de l'instanciation il

    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) 
    

    Cela devrait techniquement travailler se sente cependant un peu hackish me donc je ne recommanderais pas cette approche.

  2. ajuster la logique de validation dans le sérialiseur pour ajouter les paramètres 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) 
    

    je me sens personnellement cette approche est plus propre, même si elle fuit un peu d'informations sur le viewset au sérialiseur.

Veuillez noter que le code n'a pas été testé, vous devrez donc faire quelques tests, mais vous devriez commencer.

+0

Génial @ miki725. Je vais essayer maintenant. Merci beaucoup! – Porter