2016-01-26 3 views
0

В настоящее время это то, что я имею в urls.py:Джанго Rest Рамочные настройки

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") 

Затем он вернется распечатку, например

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" 
} 

Так что мои другие функции могут использовать Dict, который был возвращен.

Кто-нибудь знает, как я могу это сделать?

ответ

1

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 

Обновление:

Данные POST, то есть {"id":"joe"}, доступны в request и могут быть доступны через request.POST.

+0

Спасибо, но как бы получить входные данные для функции add? Для меня вход должен быть '{'id': 'joe'}', но это может быть что-то вроде 'id joe' в порядке. Так что: 'POST http: //example.com/users/1/add? Id = joe & name = joe1' – Joe

+0

Я предполагаю, что вход является частью полезной нагрузки запроса POST, я обновил ответ. Пожалуйста, посмотрите –

+0

Извините, если я не был чист. Я имел в виду, что POST будет принимать эти значения в качестве входов, а функция 'add' будет использовать его. Поэтому внутри 'add', если я ссылаюсь на' id', он должен иметь значение 'joe' – Joe

Смежные вопросы