26

基本的に、カスタム Router を作成せずに、より多くのビューを Router にアタッチする良い方法を見つけようとしています。これを達成するための良い方法は何ですか?

これは、私が達成しようとしているものと同等のものです。変数名が変更され、紹介したいメソッドの例は、この質問のために非常に単純化されています。

ルーター:

router = routers.SimpleRouter(trailing_slash=False)
router.register(r'myobjects', MyObjectViewSet, base_name='myobjects')
urlpatterns = router.urls

ビューセット

class MyObjectsViewSet(viewsets.ViewSet):
""" Provides API Methods to manage MyObjects. """

def list(self, request):
    """ Returns a list of MyObjects. """
    data = get_list_of_myobjects()
    return Response(data)

def retrieve(self, request, pk):
    """ Returns a single MyObject. """
    data = fetch_my_object(pk)
    return Response(data)

def destroy(self, request, pk):
    """ Deletes a single MyObject. """
    fetch_my_object_and_delete(pk)
            return Response()

含める必要がある別のメソッド タイプの 1 つの例。(これらの多くがあります):

def get_locations(self, request):
    """ Returns a list of location objects somehow related to MyObject """
    locations = calculate_something()
    return Response(locations)

最終結果は、次の URL が正しく機能し、「きれいに」実装されることです。

GET example.com/myobjects/123/locations
4

4 に答える 4

3

Routing から ViewSet の追加メソッドまで:

The Old-Fashioned Way™ など、手動でメソッドをルーティングする必要があると思います。

まず、メソッドを別のビューとして引き出します。

   set_password_view = UserViewSet.as_view({'post': 'set_password'})

(またはそのような)

次に、URL を割り当てます。

   url(r'^users/username_available/$', set_password_view, name-=...)

(またはそのような)

SOに関連する質問があります。

于 2014-01-14T08:37:44.397 に答える