gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:38 24 4
gpt4 key购买 nike

我正在尝试在 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 集,它提供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(“详细 View "), list 等等。更多信息,查看this link .通过加入 RetrieveModelMixinCreateModelMixinListModelMixin,我们创建了一个具有您所需功能的 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 集中发生。

干杯,

关于python - 在 Django Rest Framework 中使用请求参数获取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47852845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com