Как я могу захватить параметр 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.