如何在Django视图集中获取API参数? [英] How can I grab the API parameter in a Django viewset?

查看:95
本文介绍了如何在Django视图集中获取API参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个Django应用程序,该应用程序公开了REST API,用户可以通过该API查询我的应用程序的模型。我正在 此处 p>

我的路线在mySites url.py中是这样的:

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

我的序列化器如下:

  class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
类元:
模型= MyObject
字段=('id','name',)

我的视图集如下:

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

当我点击API / api / myObjects /时,它为我列出了所有myObject模型。
当我点击API / api / myObjects / 60 /时,它仅给我myid == 60的对象。
到目前为止很好!



但是,我想更改MyObjectsViewSet()的逻辑,以便可以操纵/更改当我击中/ api / myObjects / 60 /时返回的内容。因此,我不想执行 MyObjects.objects.all(),而是基于myObject ID 60来做一些更复杂的事情。但是我该怎么做呢?在这种情况下,我怎样才能抓住这个数字60?它不作为参数传递。但是我真的很需要它!

解决方案

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

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

,在您的视图集中,您可以使用以下方法获取ID:

  self.kwargs ['id'] 

Ref:http://www.django-rest-framework.org/api-guide/filtering#filtering-against-网址


I am building a Django application that exposes a REST API by which users can query my application's models. I'm following the instructions here

My Route looks like this in mySites url.py:

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

My Serializer looks like this:

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

My Viewset looks like this:

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

When I hit the API /api/myObjects/ it gives me a listing of all the myObject models. When I hit the API /api/myObjects/60/ it gives me only the myObject with id == 60. Great so far!

However, I want to change the logic of MyObjectsViewSet() such that I can manipulate/change what it returns when I hit /api/myObjects/60/. So instead of doing MyObjects.objects.all() I want to do something more complex based on the myObject ID of 60. But how can I do that?? In this viewset, how can I grab that number 60? It is not passed in as an argument. But I really need it!

解决方案

In your router, register one more url with:

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

and in your viewset you can grab the id with:

self.kwargs['id']

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

这篇关于如何在Django视图集中获取API参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆