python - Django Rest Framework 中带有请求参数的 GET 请求

标签 python django django-models django-rest-framework django-views

我正在尝试使用 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/

相关文章:

Django Celery 超过了时间限制?

python - 使用 django 序列化两个不同的模型

python - 如何使用python复制文件以及目录结构/路径?

python - 正则表达式 '\w+' 应该只返回英文单词,但它的工作方式不同

python - 使用scrapy提取所有分页链接到页面?

python - Django:login_redirect_url 不起作用

python - 电子邮件验证和密码重置 - django rest 框架和 angularjs

python - 为什么我的 matplotlib 图例总是被裁剪?

django - 在 Django 2.0 中按字段值排序

python - Django,第一次迁移时auth文件夹下的models.py如何创建初始表?