Django Rest 框架自定义

Django Rest Framework customizations

目前这是我在 urls.py:

router = DefaultRouter()
router.register(r'users', views.UserViewSet)

urlpatterns = [
   url(r'^', include(router.urls)),
   url(r'^users/$', views.UserList.as_view(), name='user-list'),
   url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))

views.py:

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class StoreList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

serializers.py:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'name')

我想这样当我对站点执行 POST 命令时,我可以执行自定义函数,例如:

POST http://example.com/users/1/add {'id': 'joe', 'name' = 'joe1'}

POST http://example.com/users/1/add?id=joe&name=joe1

将执行 add 函数,输入 id = joe。所以在函数内部我可以做类似的事情:

if id == 'john':
  return Response("NO")
else:
  return Response("Yes")

然后它将return打印出来,例如

HTTP/1.0 200 OK
Content-Encoding: gzip
Content-Language: en-us
Content-Length: 123
Content-Type: application/json
Date: Tue, 26 Jan 2016 11:11:11 GMT
Expires: Tue, 26 Jan 2016 11:22:11 GMT
Handler: product-detail
Last-Modified: Tue, 26 Jan 2016 11:11:11 GMT

{
    "result": "Function success"
}

这样我的其他函数就可以使用 returned 的字典了。

有人知道我该怎么做吗?

DRF 有一个内置机制来帮助解决这个问题,但请求方法支持是 GET。这是文档中的参考:http://www.django-rest-framework.org/api-guide/routers/#simplerouter

解决方法是覆盖您视图中的 post 函数,并将参数 add 作为其输入。例如,

urls.py

url(r'users/(?P<id>[\d]+)/(?P<method>add)/$, UserListView.as_view)

views.py

    def post(self,request, *args, **kwargs):
         method = kwargs.get('method')   # value should be "add"
         # check if the method exist in the view
         # if yes, call it
         method_obj = getattr(self, method)
         if method_obj:
                data = request.POST #{'id':'joe}
                id = data.get('id') 
                method_obj(id=id)
   def add(self, id):
         #do soemthing

Update:

POST 数据,即 {"id":"joe"}request 中可用,可以通过 request.POST 访问。