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
访问。
目前这是我在 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
访问。