2015-10-24 4 views
8

私はDjango Rest Frameworkのデフォルトルータを使用していて、リンクをカスタマイズしようとしています。私は、次のようようなものをアレンジ設定するにはどうすればよいDjango rest frameworkルータ - カスタマイズされたURLを追加して機能を表示する方法

  1. /myModels/dosomethingと、それはAPIのルートビューに記載された取得)
  2. /myModels/addModel?name=abc&address=xyz

    Views.py

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

    あなたはビュー上@detail_routeまたは@list_routeデコレータを使用して、デフォルトのルータに複数のエンドポイントを追加することができますurls.py

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

答えて

6

@detail_routeは、あなたが完全にデフォルトルータが提供するエンドポイントを交換したい場合は、カスタムルーターを書くことについて考えなければならないしかし/myModel/<id-of-model>/new-route/

に新しいエンドポイントを作成するのに対し、

@list_routeは、/myModel/new-route/に新しいエンドポイントを作成します。

DRF's documentationには、カスタムルータとサンプルカスタムルータの説明があります(例:there)。

10

私はViewSetrouterを使用する方法をお見せしましょう:

defaultrouterによると、あなたのビューセットがクラスでビューを宣言する必要があります。

私は、ユーザーAPIについて例をあげて、次のようにご案内:

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) 

私は基本的な安らかなAPIを含むUserViewSetが終了したら、私はrouterに登録:

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

だから、そこになります対応するURLで生成する:

  • listおよびcreateは、対応するURLである:/users
  • retrievepartial_updatedestroyは、対応するURLである:

    /users/<email>

は、あなたがビューセットを展開するlist_routeまたはdetail_routeを使用する必要があり、あなたがより多くのURLをカスタマイズ追加する必要があるとし

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

新しい操作は、対応するURLと一致します:

  • loginは、対応するURLである:/users/login

私はそれはあなたを助けることができると思います。

+0

user_detailオブジェクトとuser_listオブジェクトの参照先を明確にできますか? –