什么是搜索?

譬如http://127.0.0.1:8000/User/?username=maotai-0 可以检索出想要的.

自己实现原始的搜索

重写下get_queryset方法

  1. class UserViewset(viewsets.ReadOnlyModelViewSet):
  2. '''
  3. List:
  4. 查询用户列表
  5. Retrieve:
  6. 查询某用户详情
  7. '''
  8. queryset = user.objects.all()
  9. serializer_class = UserSerialiser
  10. def get_queryset(self):
  11. queryset = super(UserViewset, self).get_queryset()
  12. username = self.request.query_params.get('username', None)
  13. if username:
  14. queryset = queryset.filter(username__icontains=username)
  15. return queryset

使用django-filter来实现搜索-支持drf

  • 准备数据
  1. - script/add_user.py
  2. import sys
  3. import os
  4. project_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
  5. sys.path.append(project_dir)
  6. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ops.settings")
  7. import django
  8. django.setup()
  9. from django.contrib.auth import get_user_model
  10. User = get_user_model()
  11. def get_users():
  12. for user in User.objects.all():
  13. print(user.username)
  14. if __name__ == "__main__":
  15. get_users()
  • 配置搜索
  1. pip install django_filters
  2. 安装到app
  3. 注: django_filters.rest_framework.DjangoFilterBackend 已支持drf.

使用系统内置的filterbackend

  1. from django_filters.rest_framework import DjangoFilterBackend
  2. from rest_framework import viewsets
  3. from .serializer import UserSerialiser
  4. class UserViewset(viewsets.ReadOnlyModelViewSet):
  5. '''
  6. List:
  7. 查询用户列表
  8. Retrieve:
  9. 查询某用户详情
  10. '''
  11. queryset = user.objects.all()
  12. serializer_class = UserSerialiser
  13. filter_backends = (DjangoFilterBackend,) # 指定backends
  14. filter_fields = ('username',) # 指定要搜索的字段(默认是全匹配的,不支持模糊,大小写)

指定filter_class 实现username模糊匹配

  1. - users/filters.py
  2. import django_filters
  3. from django.contrib.auth import get_user_model
  4. User = get_user_model()
  5. class UserFilter(django_filters.FilterSet):
  6. username = django_filters.CharFilter(field_name="username", lookup_expr='contains')
  7. class Meta:
  8. model = User
  9. fields = ['username']
  1. - users/vuews.py
  2. class UserViewset(viewsets.ReadOnlyModelViewSet):
  3. """
  4. retrieve:
  5. 返回指定用户信息
  6. list:
  7. 返回用户列表
  8. """
  9. queryset = User.objects.all()
  10. serializer_class = UserSerializer
  11. filter_backends = (DjangoFilterBackend,) # 也可以将这个end放在settings.py里. 全局model就不需要写这个字段了
  12. filter_class = UserFilter
  13. filter_fields = ("username",)

将backend放在settings.py里

  1. - settings.py
  2. REST_FRAMEWORK = {
  3. "PAGE_SIZE": 10,
  4. #"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination",
  5. "DEFAULT_PAGINATION_CLASS":"users.pagination.Pagination",
  6. 'DEFAULT_FILTER_BACKENDS': (
  7. 'django_filters.rest_framework.DjangoFilterBackend',
  8. )
  9. }

指定method搜索

  1. servers/filters.py
  2. import django_filters
  3. from django.db.models import Q
  4. from .models import Server
  5. server_queryset = Server.objects.all()
  6. class ServerFilter(django_filters.FilterSet):
  7. hostname = django_filters.CharFilter(method="search_hostname")
  8. def search_hostname(self, queryset, name, value):
  9. return queryset.filter(Q(hostname__icontains=value) | Q(ip__icontains=value))
  10. class Meta:
  11. model = Server
  12. fields = ['hostname']
  1. class ServerViewset(viewsets.ReadOnlyModelViewSet):
  2. """
  3. list:
  4. 列出所有服务器信息
  5. retrieve:
  6. 读取一个服务器信息
  7. """
  8. queryset = Server.objects.all()
  9. serializer_class = ServerSerializer
  10. filter_class = ServerFilter
  11. filter_fields = ('hostname',)

[django]drf知识点梳理-搜索的更多相关文章

  1. [django]drf知识点梳理-权限

    用户 - 权限 - 资源 (拥有) (绑定) django权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮 django权限控制 Djan ...

  2. [django]drf知识点梳理-分页

    msyql分页 limit offset https://www.cnblogs.com/iiiiiher/articles/8846194.html django自己实现分页 https://www ...

  3. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎  如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特 ...

  4. DRF:过滤&搜索&排序功能

    过滤功能利用的是第三方包 django_filters,搜索和排序利用的是 Django DRF 提供的 filters 示例代码如下: from rest_framework import filt ...

  5. django DRF理解

    django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...

  6. Javascript重要知识点梳理

    Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...

  7. Memcache知识点梳理

    Memcache知识点梳理 Memcached概念:    Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...

  8. 解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}

    我有一个Android客户端应用程序尝试使用Django + DRF后端进行身份验证.但是,当我尝试登录时,我收到以下响应: 403: CSRF Failed: CSRF token missing ...

  9. 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

    第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到 ...

随机推荐

  1. Python数据结构——二叉树

    数的特征和定义: 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都 ...

  2. 使用【 ajax 】【 bootstrap 】显示出小窗口 详情内容 一些代码意思可以参考下一个文章

    使用[ bootstrap ]显示出小窗口  详情内容 显示页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  3. html学习_网页与html直接的关系

  4. c++基本函数

    std::abs 求绝对值函数 double abs (double x); float abs (float x); long double abs (long double x); std::sw ...

  5. VMware与Centos系统安装 和重置root密码

    VMware与Centos系统安装   今日任务 1.Linux发行版的选择 2.vmware创建一个虚拟机(centos) 3.安装配置centos7 4.xshell配置连接虚拟机(centos) ...

  6. Codeforces 670E - Correct Bracket Sequence Editor - [对顶栈]

    题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...

  7. nowcoder 206A - Birthday - [最小费用最大流]

    题目链接:https://www.nowcoder.com/acm/contest/206/A 题目描述 恬恬的生日临近了.宇扬给她准备了一个蛋糕.正如往常一样,宇扬在蛋糕上插了n支蜡烛,并把蛋糕分为 ...

  8. linux 编程

    edit skill: 1. i:当前光标前插入 2. a:当前光标后插入 3. SHIFT+a—行尾插入 4. SHIFT+i—行首插入 5. o—>下一行插入 6. SHIFT+o--上一行 ...

  9. Python:导入自定义模块

    在C语言里为了工程文件的主程序main代码简洁的效果,我们经常用include“XXX”的来导入其.h文件 在Python里Import自己的自定义模块需要注意几个坑 以main主函数和需要导入的ha ...

  10. linux 记录所有用户bash操作日志

    记录所有用户登录系统的任何操作日志,以便有据可查. 1.编辑 /etc/profile文件.   1 # vim /etc/profil 2. 在其后添加如下内容   1 2 3 4 5 6 7 8 ...