2015-10-24 7 views
8

Utilizzo il router predefinito di Django Rest Framework e provo a personalizzare i miei collegamenti.Router di Django resto framework: come aggiungere URL personalizzati e visualizzare le funzioni

Come impostare organizzare qualcosa di simile al seguente:

  1. /myModels/dosomething (e farlo elencato nella API vista Root)
  2. /myModels/addModel?name=abc&address=xyz

    Views.py

    class MyModelViewSet(viewsets.ModelViewSet): 
        queryset = MyModel.objects.all() 
        serializer_class = MyModelSerializer 
    

    urls.py

    router = routers.DefaultRouter(trailing_slash=True) 
    router.register(r'mymodels', views.MyModelViewSet) 
    

risposta

6

È possibile aggiungere più punti finali a un router predefinito utilizzando @detail_route o @list_route decoratori sulle viste.

@list_route creerà un nuovo endpoint su /myModel/new-route/, mentre @detail_route creerà nuovi endpoint su /myModel/<id-of-model>/new-route/

Tuttavia, se si desidera sostituire completamente gli endpoint forniti da router di default, si dovrebbe pensare di scrivere un router personalizzato.

DRF's documentation ha una buona spiegazione del router personalizzato e un router personalizzato di esempio come ad esempio there.

10

mi permetta di mostrare come utilizzare ViewSet e router:

Secondo defaultrouter, il vostro viewset ha bisogno di dichiarare il punto di vista della classe.

faccio un esempio su api utente e si guida come il seguente:

class UserViewSet(viewsets.ViewSet): 
    """Userviewset 
    Restful Structure: 
     | URL style  | HTTP Method | URL Nanme | Action Function | 
     |----------------|-------------|-------------|-----------------| 
     | /users   | GET, POST | user-list | user_list  | 
     | /users/<email> | GET, DELETE | user-detail | user_detail  | 
    """ 
    # Router class variables 
    lookup_field = 'email' 
    lookup_value_regex = '[\w.%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}' 

    # Viewsets class variables 
    #queryset = User.objects.all() 

    def list(self, request): 
     """GET - Show all users""" 
     print request.version 
     api_result = user_list.lists_all_users() 
     return Response(api_result) 

    def create(self, request): 
     """POST - Add new user""" 
     api_result = user_list.create_new_user(request.data) 
     return Response(api_result) 

    def retrieve(self, request, email=None): 
     """GET - Show <email> user""" 
     api_result = user_detail.retrieve_the_user(email) 
     return Response(api_result) 

    def partial_update(self, request, email=None): 
     return Response() 

    def destroy(self, request, email=None): 
     """DETELE - Delete <email> user""" 
     api_result = user_detail.destroy_the_user(email) 
     return Response(api_result) 

Quando ho finito l'UserViewSet contenente RESTful API di base, mi iscrivo in router:

router = routers.SimpleRouter(trailing_slash=False) 
router.register(prefix=r'users', viewset=UserViewSet, base_name='user') 

così non ci sarà generare con url corrispondenti:

  • list e create sono con corrispondente url: /users
  • retrieve, partial_update e destroy sono con corrispondente url: /users/<email>

Si supponga di dover aggiungere altro personalizzare gli URL, è necessario utilizzare list_route o detail_route per espandere il viewset:

@list_route(methods=['post']) 
def login(self, request): 
    """POST - login by user""" 
    ... 

Quindi la nuova azione è con l'url corrispondente:

  • login è con corrispondente url: /users/login

Spero che possa aiutare.

+0

Potrebbe chiarire che cosa il vostro user_detail e oggetti user_list si riferiscono a? –