Как я могу захватить параметр API в представлении Django?

Я создаю приложение Django, которое предоставляет REST API, с помощью которого пользователи могут запрашивать мои модели приложений. Я следую инструкциям здесь

Мой маршрут выглядит так в mySites url.py:

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

Мой сериализатор выглядит так:

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

My Viewset выглядит так:

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

Когда я нахожусь в API/api/myObjects/, он дает мне список всех моделей myObject. Когда я попадал в API/api/myObjects/60/, он дает мне только myObject с id == 60. Отлично!

Однако я хочу изменить логику MyObjectsViewSet(), чтобы я мог манипулировать/изменять то, что он возвращает, когда я нажимаю /api/myObjects/ 60/. Поэтому вместо выполнения MyObjects.objects.all() Я хочу сделать что-то более сложное на основе идентификатора myObject 60. Но как я могу это сделать? В этом представлении, как я могу захватить это число 60? Это не аргумент. Но мне это действительно нужно!

Ответ 1

В вашем маршрутизаторе зарегистрируйте еще один URL-адрес:

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

и в вашем представлении вы можете получить идентификатор с помощью:

self.kwargs['id']

Ссылка: http://www.django-rest-framework.org/api-guide/filtering#filtering-against-the-url

Ответ 2

Я думаю, вы можете обновить свое представление для нескольких операций, таких как

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)

Смотрите этот учебник, это поможет вам понять структуру REST.