Skip to main content
 首页 » 编程设计

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

2025年01月19日36mayingbao

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

View .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") 
} 

请您参考如下方法:

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

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

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

  • 实现自定义 View 集,它提供list、create 和retrieve 功能
  • 实现一个 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(“详细 View "), list 等等。更多信息,查看this link . 通过加入 RetrieveModelMixin、CreateModelMixin 和 ListModelMixin,我们创建了一个具有您所需功能的 View 集。很棒吧?

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

在你的 urls.py 中

只需在实例化期间将您的 View 传递给路由器,并将其包含在您的 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 不会创建新的模型实例,而是将此任务委托(delegate)给 serializer_class 中设置的序列化程序。也就是说,要使上述代码正常工作,您需要使用 ModelSerializer,根据您已经在使用的名称 ItemSerializer 判断是什么,或者实现您的自定义创建逻辑.这可以通过覆盖 ItemViewSet 类中的 create 方法或通过在序列化程序上实现 create 来在自定义 View 集中发生。

干杯,