Django REST framework实现关键词检索

注:下文需要使用Django REST framework中的 API,包括viewsets、serializer等,对这些API本文不作讨论,如果想了解API的具体使用,请见​​Django REST官网​​​。
如果你对Django 和Django REST不熟悉,不建议阅读本文~

本文意图实现一个简单的关键词检索的功能,其核心非常简单,就是SQL语句中的​​SELECT * FROM table where keyword like '%{param}%'​​​。
但是在Django中,我们除了使用SQL语句外,也可以使用Django提供的数据过滤方法fliter()实现相同的功能:

Place.objects.filter(keyword__contains={param})

其中,{param}是我们要填入的参数,也就是要查询的关键字。

流程图


Created with Raphaël 2.1.0 开始 url传入关键字参数 服务器获取该参数 服务器执行查询语句 返回查询结果 结束


我们要实现的工作就是接收用户输入的参数,然后把参数传递到服务器端,然后执行上面这条语句,最后将执行结果返回到浏览器端。为了简化这一步骤,用户输入的参数,直接写到URL中,通过URL传给服务器。因此,我们需要修改urls.py 和 views.py 两部分

  • 修改urls.py
  • 修改views.py


1、修改urls.py

from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()

"""
注意url的设计,(?P<keyword>.+)是一段正则表达式,在url中必须有'keyword'。
. 表示匹配除换行符\n 之外的任何单字符
+ 匹配前面的子表达式一次或多次
"""
router.register(r'keyword/(?P<keyword>.+)/$', views.KeywordSearchViewSet)

urlpatterns = router.urls


2、修改views.py

from . import models, serializers
from rest_framework import viewsets, permissions
from rest_framework.response import Response

class KeywordSearchViewSet(viewsets.ModelViewSet):
queryset = models.MyModel.objects.all()
serializer_class = serializers.MyModelSerializer
permission_classes = [permissions.AllowAny]

# 核心部分就是list方法
def list(self, request):
keyword = request.GET.get('keyword') # 获取参数
if keyword is not None: # 如果参数不为空
# 执行filter()方法
queryset = models.MyModel.objects.filter(keyword__contains=keyword)
else:
# 如果参数为空,执行all()方法
queryset = models.MyModel.objects.all()
serializer = serializers.MyModelSerializer(queryset, many=True)
return Response(serializer.data) # 最后返回经过序列化的数据


3、测试

在浏览器地址栏里,输入url,比如我这里是:​​"www.example.com/?keyword=银行"​​(在实际生产中,我的keyword其实是name,原理都是一样的)

我们将‘银行’作为关键词写入到url中,服务器通过GET方法获取到这个关键词,然后执行查询,最后返回一个经过序列化的结果(Django REST 里是json字符串)

Django REST framework实现关键词检索_django

json结果如下,如果仔细观察会发现name是“交通银行”,包含“银行”这两个字。证明刚刚写的程序是可以实现一个简单的关键词查询的。

Django REST framework实现关键词检索_服务器_02

问:遇到一个经常更改需求的项目经理,你会怎么办??!!