我正在尝试使用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")
}
答案 0 :(得分:1)
如果你想保持简洁明了,那么django rest framework就可以提供这个功能(ish)。为了使其正常工作,您需要稍微编辑一下代码。
Django rest框架提供了所谓的viewsets
,它提供了开箱即用的CRUD
操作端点。更重要的是,通过继承rest_framework.generics.GenericViewSet
并有选择地添加所谓的mixins,我们可以限制我们想要为此端点提供的操作。
为了实现您想要的功能,我们将
list
,create
和retrieve
功能SimpleRouter
来处理我们的路由并将其包含在我们的根网址中。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。
通过投入RetrieveModelMixin
,CreateModelMixin
和ListModelMixin
,我们创建了一个包含所需功能的视图集。真棒吗?
开箱即用,处理实例级查找的RetrieveModelMixin
基于pk
属性执行查询。为了更改它,我们将lookup_field
属性覆盖为'item_name'
。完成此操作后,您的自定义视图集即可开始使用。接下来,我们将使用django rest framework&#39; SimpleRouter
自动包含我们所有的viewset路径。
在实例化过程中将视图简单地传递给路由器并将其包含在您的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