在Django Rest Framework中使用请求参数获取请求

问题描述 投票:1回答:1

我试图在Django Rest中使用请求参数进行GET。

views.朋友 :-

class ItemView(generics.ListCreateAPIView):

    queryset = itemlist.objects.all()
    serializer_class = ItemListSerializer

    def perform_create(self, serializer):

        serializer.save()

    def get_queryset(self):

        queryset = itemlist.objects.all()

        get_param = self.request.GET.get('get_param')
        if get_param:
            queryset = queryset.filter(item_name=get_param)

        return queryset

URLs.朋友 :-

urlpatterns = {

    url(r'^itemlists/$', ItemView.as_view(), name="itemlist")
}

itemlists/返回所有项目的列表。但是,我想返回一个特定项目,让我们说,item_name = "abcd" URL看起来像,itemlists/abcd/

我试过了,

urlpatterns = {

    url(r'^itemlists/(?P<pk>\d+)$', ItemView.as_view(), name="itemlist")
}
python django django-models django-rest-framework django-views
1个回答
1
投票

如果你想保持简单明了,那么django rest框架就可以提供这个功能(ish)。为了使其正常工作,您需要稍微编辑代码。

Django rest框架提供了所谓的viewsets,它提供了开箱即用的CRUD操作端点。更重要的是,通过继承rest_framework.generics.GenericViewSet并有选择地添加所谓的mixins,我们可以限制我们想要为此端点提供的操作。

为了实现您想要的功能,我们会

  • 实现自定义视图集,提供listcreateretrieve功能
  • 实现一个SimpleRouter,它负责我们的路由并将其包含在我们的根URL配置中。

In your view.py

from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import (RetrieveModelMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin)

class ItemViewSet(RetrieveModelMixin, CreateModelMixin, ListModelMixin, GenericViewSet):

    queryset = itemlist.objects.all()
    serializer_class = ItemListSerializer
    lookup_field = 'item_name'

这里发生了什么?虽然GenericViewSet为我们提供了一个起点,但是django rest framework的mixins使我们能够选择性地投入我们想要实现的动作,即retrieve(“详细视图”),list等等。有关更多信息,请查看this link。通过投掷RetrieveModelMixinCreateModelMixinListModelMixin,我们创建了一个具有所需功能的视图集。真棒吗?

开箱即用,处理实例级查找的RetrieveModelMixin基于pk属性执行查询。为了改变它,我们将lookup_field属性覆盖为'item_name'。完成此操作后,您的自定义视图集即可开始使用。接下来,我们将使用django rest framework的SimpleRouter自动包含我们所有viewset的路径。

In your urls.py

只需在实例化过程中将视图传递给路由器,并将其包含在您的URL配置中。请注意,urlconf是一个list并且有括号,而不是花括号(如您的问题所示)。

from rest_framework import routers
from somwhere.views import ItemViewSet
# ...
router = router.SimpleRouter()
router.register(r'itemlist', ItemViewSet)

urlpatterns = [
    # ... other stuff
    url(r'', include(router.urls)),
]

Limitations

CreateModelMixin不会创建新的模型实例,而是将此任务委托给serializer_class中设置的序列化程序。也就是说,要使上述代码起作用,您需要使用ModelSerializer,从您已经在做的名称ItemSerializer判断或实现您的自定义创建逻辑。这可以通过覆盖create类中的ItemViewSet方法或在序列化程序上实现create来在自定义视图集中发生。

干杯,D

© www.soinside.com 2019 - 2024. All rights reserved.