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. HTML与CSS结合的四种方式

    HTML与CSS结合的四种方式: 方式一:每个标签加一个属性: 例如:<div style="background-color:red; color: green"> ...

  2. 软件设计之基于Java的连连看小游戏(三)——所有功能的实现

    新年快乐!期末接二连三的考试实在太忙了忘记连连看没有更新完,今天想要学习生信时才发现.所以这次直接把连连看所有功能全部放上. 在传统的连连看的基础上,我增加了上传头像的功能,即可以自行上传图片作为游戏 ...

  3. 阿里巴巴的26款Java开源项目,赶紧戳…

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  4. pip速度慢解决办法

    pip速度慢解决办法 sudo pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 注意加不加sudo是 ...

  5. 简单模拟B1011

    #include<iostream> using namespace std; int main() { int n; long long a,b,c; cin >> n; ; ...

  6. [极客大挑战 2019]BuyFlag

    0x00 知识点 php中的strcmp漏洞 说明: int strcmp ( string $str1 , string $str2 ) 参数 str1第一个字符串.str2第二个字符串.如果 st ...

  7. iOS 蓝牙开发详解

    目前iOS智能硬件的开发交互方式主要分为两种,一种是基于低功耗的蓝牙4.0技术(由于耗电低,也称作为BLE(Bluetooth Low Energy))对应iOS的框架为CoreBluetooth,另 ...

  8. [Python]distributed 1.21.8 requires msgpack, which is not installed.

    个人博客原文地址:http://www.bearoom.xyz/2019/08/24/python-devolop-en-msgpack-problem/ 在安装tensorflow的时候,出现了这个 ...

  9. Ubuntu16.04编译OpenCV3.4.7

    原文:https://www.bearoom.xyz/2019/08/20/ubuntu16-04-make-opencv3-4-7/ 一.前言 因为之前作死乱搞系统,然后就把Ubuntu的系统搞垮了 ...

  10. java查看简单GC日志

    测试代码: public class GCtest { public static void main(String[] args) { for (int i = 0; i < 10000; i ...