使用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来自定义过滤器。