我正在尝试使用 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")
}
最佳答案
如果您想让它保持简单明了,djangorest框架提供了开箱即用的功能(ish)。为了使其正常工作,您需要稍微编辑一下代码。
Django Rest框架提供了所谓的viewsets
,它提供了开箱即用的CRUD
操作端点。此外,通过子类化 rest_framework.generics.GenericViewSet
并有选择地添加所谓的混合,我们可以限制我们想要为此端点提供的操作。
为了实现您想要的功能,我们将
- 实现自定义 View 集,它提供
列表
、创建
和检索
功能 - 实现一个
SimpleRouter
来为我们处理路由并将其包含在我们的根 url 配置中。
在你看来.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 ")、列表
等等。欲了解更多信息,请查看this link 。
通过添加 RetrieveModelMixin、CreateModelMixin 和 ListModelMixin,我们创建了一个具有您所需功能的 View 集。很棒吧?
处理实例级查找的RetrieveModelMixin
开箱即用,根据pk
属性执行查询。为了更改它,我们将 lookup_field
属性覆盖为 'item_name'
。完成此操作后,您的自定义 View 集就可以使用了。接下来,我们将使用 django Rest 框架的 SimpleRouter
自动包含我们所有 View 集的路由。
在你的 urls.py 中
只需在实例化期间将您的 View 传递给路由器并将其包含在您的 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
不会创建新的模型实例,而是将此任务委托(delegate)给 serializer_class
中设置的序列化器。也就是说,要使上述代码正常工作,您要么需要使用 ModelSerializer
(从您已经执行的名称 ItemSerializer
来看),要么实现自定义创建逻辑。这可以通过重写 ItemViewSet
类中的 create
方法或在序列化器上实现 create
来在自定义 View 集中发生。
干杯, d
关于python - Django Rest Framework 中带有请求参数的 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47852845/