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

时间:2017-12-17 06:45:57

标签: python django django-models django-rest-framework django-views

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

views.py: -

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.py: -

urlpatterns = {

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

itemlists/返回所有项目的列表。但是,我想返回一个特定的项目,让我们说,item_name = "abcd" 网址将如下itemlists/abcd/

我试过了,

urlpatterns = {

    url(r'^itemlists/(?P<pk>\d+)$', ItemView.as_view(), name="itemlist")
}

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 实施自定义视图集,该视图集提供listcreateretrieve功能
  • 实施一个SimpleRouter来处理我们的路由并将其包含在我们的根网址中。

在你的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&#39; mixins使我们能够有选择地投入我们想要实施的行动,即retrieve(&#34;详细视图&#34 ;),list等等。有关详情,请查看this link。 通过投入RetrieveModelMixinCreateModelMixinListModelMixin,我们创建了一个包含所需功能的视图集。真棒吗?

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

在您的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)),
]

限制

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

干杯, d