【问题标题】:GET request with request parameter in Django Rest Framework在 Django Rest Framework 中使用请求参数获取请求
【发布时间】:2018-05-30 20:58:37
【问题描述】:

我正在尝试使用 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" URL 看起来像 itemlists/abcd/

我试过了,

urlpatterns = {

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

【问题讨论】:

  • 能否请您搜索DetailView。我希望这能达到你的目的。

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


【解决方案1】:

如果您想保持简单明了,django rest 框架提供了开箱即用的功能(ish)。为了让它工作,你需要稍微编辑你的代码。

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

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

  • 实现自定义视图集,提供listcreateretrieve 功能
  • 实现一个SimpleRouter,它会为我们处理路由并将其包含在我们的根 url conf 中。

在你的 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 框架的 mixins 使我们能够有选择地投入我们想要实现的操作,即retrieve(“详细视图”)、list 等等。欲了解更多信息,请查看this link。 通过添加RetrieveModelMixinCreateModelMixinListModelMixin,我们创建了一个具有您所需功能的视图集。厉害吧?

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

在你的 urls.py 中

只需在实例化期间将您的视图传递给路由器并将其包含在您的 url conf 中。请注意, 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 来看,您已经在做,要么实现您的自定义创建逻辑。这可以通过覆盖 ItemViewSet 类中的 create 方法或通过在序列化程序上实现 create 在您的自定义视图集中发生。

干杯, D

【讨论】:

  • 您好,感谢您的回答。我的网址应该是什么?
  • 我的意思是,GET 调用 url
  • 如果urls.py 是您的根conf,您的列表端点是{host}/itemlist/,您的详细视图是{Host}/itemlist/{item_name}/
  • 它不会导致该特定 {item_name} 的视图,而是显示所有项目,即 itemlist/
  • 您可以将代码粘贴到您的问题中吗?我在提交答案之前尝试了代码,它对我有用。