Filter定义

定义如下Filter类

class BookFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='icontains')
author = django_filters.CharFilter(lookup_expr='icontains')
isbn = django_filters.NumberFilter(lookup_expr='icontains')
press = django_filters.CharFilter(lookup_expr='icontains') class Meta:
model = Book
fields = {'name', 'author', 'isbn', 'press'}
这个类解释如下:

model 该类是为Model Book定义的过滤类

fields 该过滤类可以处理Book model中字段name,author,isbn,press的查询

name = django_filters.CharFilter(lookup_expr='icontains') 指定name字段的过滤条件为icontains

值得注意的是django_filters如何只指定fields,不指定特定fields的过滤方法, 那么默认会使用exact的过滤条件进行查询。
在view中的使用
# filter objects according to user inputs
objects = BookFilter(request.POST, queryset=objects) recordsFiltered = objects.qs.count()
objects = objects.qs[start:(start + length)]

在官网的介绍当中,使用的比较多场景是使用过滤器的返回值作为参数去渲染模板文件。那如果需要后端进行分页处理, 就需要使用返回值的qs属性呢

比如示例当中的 recordsFiltered = objects.qs.count(), 将查询得到的query set的记录个数返回给前端Datatable插件。

多表查询

单表查询比较容易理解, 那么当我们需要使用多表查询的时候, 该怎么做呢?

model定义
class Book(models.Model):
name = models.CharField(max_length=48)
isbn = models.IntegerField(primary_key=True, unique=True)
author = models.CharField(max_length=24)
press = models.CharField(max_length=48)
price = models.PositiveIntegerField(default=0) class LibBook(models.Model):
# Relations
book = models.ForeignKey(Book, on_delete=models.PROTECT,null=False)
# Attributes uuid = models.UUIDField(default=uuid.uuid4, null=False)
inDate = models.DateField(auto_now_add=True)
dueDate = models.DateField(blank=True, null=True)
overDays = models.PositiveIntegerField(default=0)
LendAmount = models.PositiveIntegerField(default=0)

在这个例子当中,书本信息和馆藏图书是一对多的关系,我们在LibBook当中使用ForeignKey来指定LibBook和Book之间的关系。

问题: 如何使用书本的书名和isbn信息来查询本地图书馆的藏书信息?
Fileter定义
class LibBookFilter(django_filters.FilterSet):
book__name = django_filters.CharFilter(lookup_expr='icontains')
book__isbn = django_filters.NumberFilter(lookup_expr='icontains') class Meta:
model = LibBook
fields = {'book__name', 'book__isbn'}

值得注意的是fields的定义, 要使用Django中规定的双下划线符号__来指定查询的字段。

在本例中, 我们同样指定查询的条件是icontains

View使用
# filter objects according to user inputs
objects = LibBookFilter(request.POST, queryset=objects)
recordsFiltered = objects.qs.count()
objects = objects.qs[start:(start + length)]

看到这里,感觉和单表查询也差不了太多啊。 在笔者使用django_filters的过程中,最大的坑就是在这里呢, 怎么设置都不好使。后来发现问题是:

POST 数据定义

前端同样使用ajax将查询数据通过POST传到后台。 ajax的data必须如下定义,django_filters才能正常工作。

"ajax": {
"url": "#",
"type": "POST",
"data": function(d){
return $.extend( {}, d, {
"book__isbn" : document.getElementById('isbn').value,
"book__name" : document.getElementById('book').value,
});
}
},

注意POST数据的数据名字必须和Filter中保持一致才行

注意需在settings中添加配置:

INSTALLED_APPS = [
‘django_filters’
] REST_FRAMEWORK = {
‘DEFAULT_FILTER_BACKENDS’: ( ‘django_filters.rest_framework.DjangoFilterBackend’,
),
}

djangp-filter的使用的更多相关文章

  1. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  2. JavaWeb——Filter

    一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...

  3. 以bank account 数据为例,认识elasticsearch query 和 filter

    Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...

  4. AngularJS过滤器filter-保留小数,小数点-$filter

    AngularJS      保留小数 默认是保留3位 固定的套路是 {{deom | number:4}} 意思就是保留小数点 的后四位 在渲染页面的时候 加入这儿个代码 用来精确浮点数,指定小数点 ...

  5. 挑子学习笔记:特征选择——基于假设检验的Filter方法

    转载请标明出处: http://www.cnblogs.com/tiaozistudy/p/hypothesis_testing_based_feature_selection.html Filter ...

  6. [模拟电路] 2、Passive Band Pass Filter

    note: Some articles are very good in http://www.electronics-tutorials.ws/,I share them in the Cnblog ...

  7. AngularJS过滤器filter-时间日期格式-渲染日期格式-$filter

    今天遇到了这些问题索性就 写篇文章吧 话不多说直接上栗子 不管任何是HTML格式还是JS格式必须要在  controller 里面写 // new Date() 获取当前时间 yyyy-MM-ddd ...

  8. 《ES6基础教程》之 map、forEach、filter indexOf 用法

    1,map,对数组的每个元素进行一定操作,返回一个新的数组. var oldArr = [{first_name:"Colin",last_name:"Toh" ...

  9. 1. 使用Filter 作为控制器

    最近整理一下学习笔记,并且准备放到自己的博客上.也顺便把Struts2 复习一遍 1. MVC 设计模式概览 实现 MVC(Model.View.Controller) 模式的应用程序由 3 大部分构 ...

  10. angularjs之filter过滤器

    现在公司用ionic,就是基于angularjs封装了一些api用于webapp,最近用的angularjs的filter确实省了很多代码,现在总结一下! ng比较鸡肋的过滤器,这里就一笔带过吧!鸡汤 ...

随机推荐

  1. POJ-1733 Parity game(带权并查集区间合并)

    http://poj.org/problem?id=1733 题目描述 你和你的朋友玩一个游戏.你的朋友写下来一连串的0或者1.你选择一个连续的子序列然后问他,这个子序列包含1的个数是奇数还是偶数.你 ...

  2. da道至简读后感

    大道至简,衍化至繁. 往往特别深奥的事却是从特别简洁的发展而成的,就像麦克斯韦仅仅凭一个方程组就统一了电磁学一样,物理学中的算式往往非常简练.开普勒计算天体运行的时候是遵循老师认同的地心说计算的,结果 ...

  3. java线程——线程基础

    一,线程之间的关系 线程之间存在两种关系: (1)间接相互制约:相互争夺线程资源: (2)直接相互制约:线程之间的相互合作: 间接相互制约也可以成为互斥,直接相互制约也可以称为同步:同步也包括互斥,互 ...

  4. Mac中制作USB系统启动盘

    .iso镜像文件转 .dmg文件 hdiutil convert -format UDRW -o linuxmint.dmg ~/Desktop/linuxmint-19-cinnamon-64bit ...

  5. 同时运行两个版本相同的tomcat

    由于项目需要,代理集群和一个节点都部署在本地,那么就需要有两个tomcat,一个部署集群,一个部署项目,我都用了7.0.34版本的tomcat 当启动代理的tomcat成功时,再启动节点的tomcat ...

  6. 【MySQL参数】-innodb_additional_mem_pool_size

    原博客:https://yq.aliyun.com/articles/32384

  7. py02_01:初识模块

    模块的定义:模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.(可以理解为:库) 模块分为三类 ( 1. 标准库:     直接导入使用 ...

  8. java的io字符流关闭和刷新.flush();

    因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中. 但是关闭的流对象,是无法继续写出数据 的.如果我们既想写出数据,又想继续使用流,就需要 flush 方法了. flush :刷新缓冲区, ...

  9. GitHub 中 readme 如何添加图片

    一.Readme 是什么 readme文件一般是放在github 每个repo的根目录下,用来解释.说明本repo的主要内容和相关信息.而且在repo主页进去的时候会被自动加载.一般采用md标记的文本 ...

  10. 关于使用静态链表实现一元多项式的相加&&乘积

    一元多项式的相加类似于两条链表的合并 当然前提是链表中的幂指数是按顺序排列的 此题中的链表采用的是升序排列,输出也是按升序输出的 #include<stdio.h> #include< ...