1

Django Rest Framework を使用して API を作成しています。特定のオブジェクトに関する情報を返すために @link を使用しています。

class SomeClassView(viewsets.ReadOnlyModelViewSet):
   @link
   def info(self, request, pk=None):
       obj = models.SomeClass.objects.get(pk=pk)
       return Response({"info": object.info()})

 GET: /someclass/1/info

私がやりたいのは、メソッドを拡張して「クラスレベル」でアクセスできるようにして、APIがオブジェクトのリストを受け入れることができるようにすることです

class SomeClassView(viewsets.ReadOnlyModelViewSet):
   @link
   def info(self, request, pk=None):
       if isinstance(s, str):
           obj = models.SomeClass.objects.get(pk=pk)
           return Response({"info": obj.info()})
       else:
           objs = models.SomeClass.objects.filter(pk__in=pk).all()
           return Response({"infos": [obj.info() for obj in objs]})

GET: /someclass/1/info
GET: /someclass/info?pk=1&pk=2&pk=3

API にクラス レベルのメソッドを追加する方法はありますか? それとも、1 つの API 呼び出しを処理するために新しいクラスを作成する必要がありますか?

PS:これを機能させるために別の方法が必要かどうかは気にしません

4

1 に答える 1

3

@linkまたはデコレータを使用して動的に生成されたルートは、 の@actionようにハードコーディングされています/someclass/<pk>/<methodname>//someclass/infoカスタム ルートを追加することで、エンドポイントを公開できます。

class MyRouter(DefaultRouter):
    routes = [
        Route(
            url=r'^{prefix}/((?P<pk>\d+)/)?info$',
            mapping={'get': 'info'},
            name='{basename}-info',
            initkwargs={}
        )
    ] + DefaultRouter.routes

次に、infoメソッドは次のようになります。

def info(self, request, pk=None):
    if pk:
        obj = SomeClass.objects.get(pk=pk)
        return Response({'info': obj.info()})
    else:
        objs = SomeClass.objects.filter(pk__in=request.GET.getlist('pk'))
        return Response({'infos': [obj.info() for obj in objs]})

(@linkデコレータがないことに注意してください。)

于 2013-10-01T09:12:19.320 に答える