我试图在Django Rest中使用请求参数进行GET。
views.朋友 :-
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.朋友 :-
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
并有选择地添加所谓的mixins,我们可以限制我们想要为此端点提供的操作。
为了实现您想要的功能,我们会
list
,create
和retrieve
功能SimpleRouter
,它负责我们的路由并将其包含在我们的根URL配置中。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的mixins
使我们能够选择性地投入我们想要实现的动作,即retrieve
(“详细视图”),list
等等。有关更多信息,请查看this link。通过投掷RetrieveModelMixin
,CreateModelMixin
和ListModelMixin
,我们创建了一个具有所需功能的视图集。真棒吗?
开箱即用,处理实例级查找的RetrieveModelMixin
基于pk
属性执行查询。为了改变它,我们将lookup_field
属性覆盖为'item_name'
。完成此操作后,您的自定义视图集即可开始使用。接下来,我们将使用django rest framework的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