如何在Django视图集中获取API参数?

时间:2014-02-26 06:58:22

标签: python django rest

我正在构建一个Django应用程序,它公开了一个REST API,用户可以通过它查询我的应用程序的模型。我按照说明here

我的路线在mySites url.py中显示如下:

router.register(r'myObjects', views.MyObjectsViewSet)
....
url(r'^api/', include(router.urls)),

我的Serializer看起来像这样:

class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyObject
    fields = ('id', 'name',)

我的视图集如下所示:

class MyObjectsViewSet(viewsets.ModelViewSet):
    queryset = MyObjects.objects.all()
    serializer_class = MyObjectSerializer

当我点击API / api / myObjects /时,它会给我一个所有myObject模型的列表。 当我点击API / api / myObjects / 60 /时,它只给我一个id == 60的myObject。 到目前为止很棒!

但是,我想改变MyObjectsViewSet()的逻辑,以便我可以操作/更改当我点击/ api / myObjects / 60 /时返回的内容。所以我没有做 MyObjects.objects.all(),而是想根据myObject ID为60做一些更复杂的事情。但是我怎么能这样做?在这个视图中,我怎么能抓住这个数字60?它不作为参数传递。但我真的需要它!

3 个答案:

答案 0 :(得分:13)

在您的路由器中,再注册一个以下网址:

router.register(r'myObjects/(?P<id>\d+)', views.MyObjectsViewSet)

并在您的视图中,您可以使用以下命令获取ID:

self.kwargs['id']

参考:http://www.django-rest-framework.org/api-guide/filtering#filtering-against-the-url

答案 1 :(得分:0)

我认为您可以更新您的视图以进行多项操作,例如

class RetrieveUpdateAPIView(mixins.RetrieveModelMixin,
                        mixins.UpdateModelMixin,
                        generics.SingleObjectAPIView):
"""
Concrete view for retrieving or updating a model instance.
FIXME: the newest version of rest_framework has this class
"""

def get(self, request, *args, **kwargs):
    return self.retrieve(request, *args, **kwargs)

def put(self, request, *args, **kwargs):
    return self.update(request, *args, **kwargs)

def create(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)

请注意这个tutorial它将帮助您理解REST框架。

答案 2 :(得分:0)

我觉得 cyriacthomas 是对的,但可能需要更多细节。虽然我不确定为什么使用 self

我相信代码片段看起来像:

class MyObjectsViewSet(viewsets.ModelViewSet):
    queryset = MyObjects.objects.all()
    serializer_class = MyObjectSerializer

    # Inside your class, you overwrite the retrieve function
    def retrieve(self, request, *args, **kwargs):
        obj_id = kwargs['id']

        query = MyObjects.objects.get(obj_id)

        # do something with data

        return self.serializer_class(data=query).data