使用Django Rest Framework时,设置过滤器以仅响应特定的数据

简述

这篇文章是一个初学者用RESTful API和Swift开发iPhone优惠券服务的步骤按顺序记录下来的。由于边查找技术要素边实施,所以实现过程非常迂回。

在上一篇 Django Rest Framework 介绍了如何创建 RESTful API 的基本机制。下一步,我们将对其进行修改,使其能够根据请求参数来筛选与条件相匹配的数据。

根据消息,似乎使用 Django-rest-framework 构建的 API 可以通过 Generic Filtering 实现筛选功能,所以我们会使用该方法来进行实现。

请参阅

    適当に作る python Djnago REST frameworkで作る初めてのAPI

环境: 环境

请将以下内容进行中文本地化翻译,只需要一种选项:
Mac OS 10.15
VSCode 1.39.2
pipenv 2018.11.26
Python 3.7.4
Django 2.2.6

Mac OS 10.15
VSCode 1.39.2
pipenv 2018.11.26
Python 3.7.4
Django 2.2.6

操作步骤

    • django-filter をインストール

 

    • フィルタが使えるように setting.py に追記

 

    • views.py にfilter_fields を追記する

 

    試してみる

安装django-filter

在使用pipenv创建的Python项目(虚拟环境)中安装django-filter。进入pipenv的命令行界面,执行以下安装命令。

$ pipenv install django-filter

查看Pipfile后发现,在[packages]中添加了django-filter。

(amiApp) bash-3.2$ cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
django = "*"
djangorestframework = "*"
django-filter = "*"

[requires]
python_version = "3.7"

在setting.py中添加内容以启用过滤器功能。

将 ami_coupon_api/setting.py 文件中的 INSTALLED_APPS 配置项添加 django_filters。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'coupon',
    'rest_framework',
    'django_filters', # 追加した

接下来,在ami_coupon_api/setting.py中创建REST_FRAMEWORK = {}的项目,并添加以下设置以便使用过滤器。


REST_FRAMEWORK = {
    #フィルタを追加
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

在 views.py 中添加 filter_fields

只需在CouponViewSet类中调用filter_fields,并将coupon模型的模型字段名(coupon表的项目)设置为filter_fields的参数。还可以进行多个设置。可以使用filter_fields设置的字段名称对响应数据进行过滤。


class CouponViewSet(viewsets.ModelViewSet):
    queryset = Coupon.objects.all()
    serializer_class = CouponSerializer
    filter_fields = ('status','code') #追加した

我要試一試。

我将使用curl命令发送请求。在URL末尾添加 ?[条件] 。条件部分使用filter_fields中设置的模型字段名。

如果只想获取模型字段status为”false”的优惠券,可以在URL末尾加上?status=false,并按以下方式发出请求。

curl -X GET http://127.0.0.1:8000/api/coupons/?status=false

虽然有些难以理解,但我只能获得id=5的状态为假的优惠券,具体如下。


[{“id”:5,”code”:”0005″,”benefit”:”【雨天特惠】从结账处享受15%的折扣”,”explanation”:”仅限在发放优惠券时使用,不可与其他优惠券同时使用”,”store”:”所有门店”,”start”:”2019-10-01″,”deadline”:”2019-12-31″,”status”:false}]


由于filter_fields中设置了`code`作为要过滤的字段名称,因此我们也尝试使用`code`进行过滤。

舉例來說,獲取代碼為0007的優惠券的請求,URL末尾需要加上?code=0007,如下所示。

curl -X GET http://127.0.0.1:8000/api/coupons/?code=0007

我只能获得0007代码的优惠券。


[{“id”:7,”code”:”0007″,”benefit”:”账单打折19%”,”explanation”:”仅限2019年12月29日至12月31日。不可与其他优惠券叠加使用”,”store”:”神田店”,”start”:”2019-12-29″,”deadline”:”2019-12-31″,”status”:true}]


到目前为止,已经能够实现获取特定数据项中排名第一的数据的处理。然而,在优惠券分发中,也会需要根据日期等条件,如”之前”或”之后”,来进行筛选。

接下来,我们将使用Django-Filter来自定义过滤器。

广告
将在 10 秒后关闭
bannerAds