注:下文需要使用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}是我们要填入的参数,也就是要查询的关键字。
我们要实现的工作就是接收用户输入的参数,然后把参数传递到服务器端,然后执行上面这条语句,最后将执行结果返回到浏览器端。为了简化这一步骤,用户输入的参数,直接写到URL中,通过URL传给服务器。因此,我们需要修改urls.py 和 views.py 两部分
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
"""
注意url的设计,(?P.+)是一段正则表达式,在url中必须有'keyword'。
. 表示匹配除换行符\n 之外的任何单字符
+ 匹配前面的子表达式一次或多次
"""
router.register(r'keyword/(?P.+)/$' , views.KeywordSearchViewSet)
urlpatterns = router.urls
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) # 最后返回经过序列化的数据
在浏览器地址栏里,输入url,比如我这里是:"www.example.com/?keyword=银行"
(在实际生产中,我的keyword其实是name,原理都是一样的)
我们将‘银行’作为关键词写入到url中,服务器通过GET方法获取到这个关键词,然后执行查询,最后返回一个经过序列化的结果(Django REST 里是json字符串)
json结果如下,如果仔细观察会发现name是“交通银行”,包含“银行”这两个字。证明刚刚写的程序是可以实现一个简单的关键词查询的。
问:遇到一个经常更改需求的项目经理,你会怎么办??!!