目标:利用django自带的filte实现精准、模糊查询 (实战代码)

步骤:

1、安装第三方库

pip  install  django-filter

2、配置setting

# 注册app
INSTALLED_APPS = ['rest_framework','django_filters',.......
]# 配置rest framework
REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

3、定义模型

# coding:utf-8
from django.db import modelsclass Teacher(models.Model):"""老师表"""name = models.CharField(verbose_name="老师姓名", max_length=16)motto = models.CharField(verbose_name="格言", max_length=32)class Student(models.Model):"""学生表"""tea = models.ForeignKey(Teacher, on_delete=models.DO_NOTHING, verbose_name="老师")name = models.CharField(verbose_name="学生姓名", max_length=16)add_time = models.DateField(verbose_name='添加日期', auto_now_add=True)age = models.IntegerField(verbose_name='年龄')

4、新建filter文件,添加filter配置

# coding:utf-8
import django_filters
from django_filters import rest_framework as filters
#coding:utf-8
from api import modelsclass ProductSourceNameListFilter(django_filters.CharFilter):def filter(self, qs, value):value = list(filter(None, value.split(",")))return super(ProductSourceNameListFilter, self).filter(qs=qs, value=value)class getUserListFilter(django_filters.rest_framework.FilterSet):'''过滤模型类'''# method one# tea = ProductSourceNameListFilter(field_name='tea', lookup_expr='in')# method twotea = filters.CharFilter(method='filter_tea', lookup_expr='in')name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')#区间过滤#method  onemin_age = django_filters.NumberFilter(field_name='age', lookup_expr='gt')max_age = django_filters.NumberFilter(field_name='age', lookup_expr='lt')#method two age = filters.NumberFilter(field_name='age', help_text='年龄')# 时间区间查询 DateFromToRangeFilterclass Meta:model = models.Studentfields = ['name', 'tea', 'min_age', 'max_age', 'add_time']  # 允许精准查询的字段search_fields = ['name', ]  # 允许模糊查询的字段,上面需要定义def filter_tea(self, queryset, name, value):value_list = list(filter(None, value.split(",")))order_ids = models.Student.objects.filter(tea__in=value_list)return queryset.filter(id__in=order_ids)

5、定义序列号,新建ser文件。

# coding:utf-8
from rest_framework import serializersfrom api import modelsclass getUserListSerializer(serializers.ModelSerializer):'''student模型序列化'''# teaname = serializers.CharField(label="老师姓名", source="tea.name")# motto = serializers.CharField(label="老师姓名", source="tea.motto")# days_since_joined = serializers.SerializerMethodField()class Meta:model = models.Student# fields = ["id", "name", "teaname", ]  # 需要系列化的字段fields = '__all__'depth = 1  # 向下取的深度# 方法写法:get_ + 字段def get_days_since_joined(self, obj):# obj指这个model的对象return '%s-24' % obj.name

6、新建views文件,配置views文件。

# coding:utf-8from django_filters import rest_framework
from rest_framework.viewsets import ModelViewSetfrom api import models
from api.utils.filter import getUserListFilter
from api.utils.ser import getUserListSerializer
from rest_framework import filters# Create your views here.class getUserListView(ModelViewSet):'''View逻辑视图'''queryset = models.Student.objects.all()   # 查询所有数据serializer_class = getUserListSerializer  # 数据序列化filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter,filters.OrderingFilter,)  # 需要用django查询的固定写法filter_class = getUserListFilter    # 定义过滤查询# 排序的字段ordering_fields = ('tea', )

7、配置路由。

    url(r'^test/$', views.getUserListView.as_view({'get': 'list'})),

8、打开postman测试接口。

http://127.0.0.1:8000/api/test/?name=&tea=1,2&add_time=2019-07-10&min_age=&max_age=

9、测试按照tea排序。

http://127.0.0.1:8000/api/test/?name=&tea=&add_time=2019-07-10&min_age=&max_age=&ordering=-tea

tips:

其中如果ordering=-tea表示降序排列,否则为升序排列。

如果 ordering_fields = ('tea', 'id')为多字段排序,可以用,隔开使用多字段排序:ordering=-tea,id

我们可以利用浏览器为我们生成过滤器字段。

Dajngo自带的Django-filter的使用详解相关推荐

  1. django批量修改table_python中Django视图(view)的详解(附示例)

    本篇文章给大家带来的内容是关于python中Django视图(view)的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一个视图函数(类),简称视图,是一个简单的Py ...

  2. 怎么创建python django项目_创建Django项目图文实例详解

    本文实例讲述了创建Django项目的方法.分享给大家供大家参考,具体如下: 创建Django项目 创建一个HelloDjango项目 GitHub地址:https://github.com/liang ...

  3. Django的信号机制详解

    Django的信号机制详解 Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行. ...

  4. Carson带你学Android:图文详解RxJava背压策略

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 本文主要讲解的是RxJava中的 背压控制策略,希望你们会喜欢. Cars ...

  5. python传入参数加星号_Python 带星号(* 或 **)的函数参数详解

    1. 带默认值的参数 在了解带星号(*)的参数之前,先看下带有默认值的参数,函数定义如下: >> def defaultValueArgs(common, defaultStr = &qu ...

  6. java压缩文件详解_Java解压和压缩带密码的zip文件过程详解

    前言 JDK自带的ZIP操作接口(java.util.zip包,请参看文章末尾的博客链接)并不支持密码,甚至也不支持中文文件名. 为了解决ZIP压缩文件的密码问题,在网上搜索良久,终于找到了winzi ...

  7. win10装linux虚拟机contos,利用win10自带虚拟机hyper-v安装centos7方法详解

    一.安装win10企业版自带虚拟机 hyper-v 1.控制面板-->程序和功能-->启用或关闭Windows功能 勾上 hyper-v 确定就ok了 2.安装成功后会发现在 左下角&qu ...

  8. VS自带工具:dumpbin的参数详解

    VS自带工具:dumpbin的参数详解 参考链接: 1.微软技术文档 2.微软官方文档描述](https://docs.microsoft.com/zh-cn/cpp/build/reference/ ...

  9. django配置环境linux,linux环境下Django的安装配置详解

    linux环境下Django的安装配置详解 1. 下载安装Django pip install Django==1.6.5 测试是否安装成功 >>> import django> ...

  10. python headr方法_对Python发送带header的http请求方法详解

    简单的header import urllib2 request = urllib2.Request('http://example.com/') request.add_header('User-A ...

最新文章

  1. 大脑通过统计推理表征“自我”
  2. 以后教育孩子学好数学的方法 多思动漫数学
  3. bzoj1025 [SCOI2009]游戏 动态规划
  4. ei加声调怎么加_空调怎么加氟 空调加氟方法【介绍】
  5. 【图文并茂】DEV配置NTL库
  6. MFC 线程的退出方法
  7. java中间语言汇编语言_中间语言(IL) | 学步园
  8. CentOs基础操作指令(进程管理)
  9. 整理 45 道 CSS 基础面试题(附答案)
  10. springboot幂等性_SpringBoot+Redis实现接口幂等性,就看这篇了
  11. python 手势检测和追踪_用kinect和python进行手势识别:嗯学习
  12. ExtJS4.2学习(11)——高级组件之Grid
  13. 安装惠普M1136打印机一直处于“新设备已连接”状态 解决方法
  14. android 外接扫码枪_Android 扫码枪以及焦点的处理
  15. Js打开QQ聊天对话窗口
  16. 3D游戏编程与设计-游戏分类与热点探索
  17. [习题]综合练习 -- SqlDataSource精灵就能完成,[山寨版] Dynamic Data WebSite
  18. windows那些讨厌的CPU占用进程
  19. 2020-4-22 深度学习笔记20 - 深度生成模型 5 (有向生成网络--sigmoid信念网络/可微生成器网络/变分自编码器VAE/生产对抗网络GAN/生成矩匹配网络)
  20. 对视频声音,音频进行音量标准化和响度均化,归一化的标准,原理以及具体操作

热门文章

  1. 环形数组队列求滑动窗口最大值
  2. 使用 Android 备份和恢复功能留住用户
  3. S7-1200 PLC高速计数器
  4. 阿里云视觉AI开发者创新应用赛十强诞生,看各路玩家如何“低代码”创作AI应用
  5. anydesk远程桌面管理工具软件下载
  6. 超全前端面试题及答案
  7. STM32CUBEMX_STM32F030F4P6_TIM1_CH3_PWM
  8. 关于我的安卓音乐播放器程序该如何使用的问题
  9. 【论文阅读】Attributed Graph Clustering with Dual Redundancy Reduction(AGC-DRR)
  10. 10. 查询没学过“张三”老师教授的任一门课程的学生姓名