什么是搜索?

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

自己实现原始的搜索

重写下get_queryset方法

class UserViewset(viewsets.ReadOnlyModelViewSet):
'''
List:
查询用户列表
Retrieve:
查询某用户详情
'''
queryset = user.objects.all()
serializer_class = UserSerialiser def get_queryset(self):
queryset = super(UserViewset, self).get_queryset()
username = self.request.query_params.get('username', None)
if username:
queryset = queryset.filter(username__icontains=username)
return queryset

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

  • 准备数据
- script/add_user.py

import sys
import os project_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(project_dir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ops.settings") import django
django.setup()
from django.contrib.auth import get_user_model
User = get_user_model() def get_users():
for user in User.objects.all():
print(user.username) if __name__ == "__main__":
get_users()
  • 配置搜索
pip install django_filters
安装到app 注: django_filters.rest_framework.DjangoFilterBackend 已支持drf.

使用系统内置的filterbackend

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

指定filter_class 实现username模糊匹配

- users/filters.py

import django_filters
from django.contrib.auth import get_user_model
User = get_user_model() class UserFilter(django_filters.FilterSet):
username = django_filters.CharFilter(field_name="username", lookup_expr='contains') class Meta:
model = User
fields = ['username']
- users/vuews.py

class UserViewset(viewsets.ReadOnlyModelViewSet):
"""
retrieve:
返回指定用户信息
list:
返回用户列表
"""
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (DjangoFilterBackend,) # 也可以将这个end放在settings.py里. 全局model就不需要写这个字段了
filter_class = UserFilter
filter_fields = ("username",)

将backend放在settings.py里

- settings.py

REST_FRAMEWORK = {
"PAGE_SIZE": 10,
#"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination",
"DEFAULT_PAGINATION_CLASS":"users.pagination.Pagination",
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
)
}

指定method搜索

servers/filters.py

import django_filters
from django.db.models import Q from .models import Server server_queryset = Server.objects.all() class ServerFilter(django_filters.FilterSet):
hostname = django_filters.CharFilter(method="search_hostname") def search_hostname(self, queryset, name, value):
return queryset.filter(Q(hostname__icontains=value) | Q(ip__icontains=value)) class Meta:
model = Server
fields = ['hostname']
class ServerViewset(viewsets.ReadOnlyModelViewSet):
"""
list:
列出所有服务器信息
retrieve:
读取一个服务器信息
"""
queryset = Server.objects.all()
serializer_class = ServerSerializer
filter_class = ServerFilter
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 读取配置文件方法

    #coding=utf8 import ConfigParser config = ConfigParser.ConfigParser() config.readfp(open(raw_input(& ...

  2. Spring的标签和验证等模块

    使用了spring,真的可以简化很多开发,但前提是你懂spring技术,并且环境,架包没错. 今天编写了登录验证的模块,但是就是验证不了,不知道哪里出错了,但是也不好改错,这样还是很费时间的. 错误提 ...

  3. web初级开发的那些坑

    1.在使用js原生的XMLHttpRequest加载.xml文件时,老是不对,按照书上的写的没错,后来才发现是我的web.xml文件中阻止了.xml文件的加载. 2.有关于string解析成json数 ...

  4. day_6.22python多线程

    僵尸进程:子进程结束,父类未结束 孤儿进程:父类进程over.,子进程未结束 0号进程负责运行,1号进程负责生成,所有孤儿进程的收容所(孤儿进程:父类进程over)1号进程,永不结束! Linux: ...

  5. Mysql 全文搜索 Match Against用法

    全文检索在 MySQL 中就是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE ...

  6. ThinkPHP框架 3.2.2 获取系统常量信息 连接数据库 命名空间的理解

    获取系统常量信息 随便一个方法里加上这句话都能获取到系统常量信息!! var_dump(get_defined_constants()); <?php namespace Admin\Contr ...

  7. 静态,关键字:static 接口,IUSB , API 接口关键字:interface

    //静态 //普通成员 //普通成员是属于对象的 //静态成员 //静态成员属于类的 //关键字:static //self关键字:在类里面代表该类 //在静态方法里面不能调用普通成员 //在普通方法 ...

  8. 新复制行绑定JQuery.autocomplete事件

    在工作中经常需要生成动态增加行的表格,此次需要对表格中的文本框绑定autocomplete功能 操作流程: 表格初始时只有一行,当页面加载时执行先执行一次增加行功能,将行增加到10行 在$(funct ...

  9. Zabbix监控MySQL免密码设置

    zabbix自带MySQL监控模板,配置文件在/etc/zabbix/zabbix_agentd.d userparameter_mysql.conf 如果MySQL不使用密码可以直接使用这个监控模板 ...

  10. nvm npm node

    npm init/install 语义版本号分为X.Y.Z三位,分别代表主版本号.次版本号和补丁版本号.当代码变更时,版本号按以下原则更新. 如果只是修复bug,需要更新Z位. 如果是新增了功能,但是 ...