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’,
),
}

最新文章

  1. mono for android学习过程系列教程(5)
  2. JavaScript 精粹
  3. 用户新加入Group
  4. hdu 5833 Zhu and 772002 高斯消元
  5. EasyUI组件(窗口组件)
  6. IT男的”幸福”生活"续2
  7. df、du、fdisk:Linux磁盘管理三板斧的使用心得(转载)
  8. How to install ruby on mac/ change ruby source in china
  9. 数据结构——图——最短路径D&F算法
  10. Java基础知识强化46:StringBuffer类之判断一个字符串是否对称案例
  11. app->h5同步身份
  12. log4cplus配置文件使用
  13. Redis数据类型之Set
  14. WEB通知和React Native之即时通讯(iOS Android)
  15. Mongodb注入
  16. 用for循环打印九九乘法表(for嵌套循环)
  17. Alpha(3/10)
  18. verilog代码 想法验证---与寄存器输出有关
  19. 设计模式 笔记 迭代器模式 Iterator
  20. Windows访问Ubuntu文件

热门文章

  1. kube-controller-manager配置详解
  2. SpringCloud学习之Hystrix请求熔断与服务降级(六)
  3. 浅入深出Java输入输出流主线知识梳理
  4. UVALive 4329 树状数组第二题
  5. scrapy练习1
  6. mysql比较运算,逻辑运算,范围查询,模糊查询
  7. 吴裕雄--天生自然 JAVASCRIPT开发学习:Date(日期) 对象
  8. 同行评审|keywords
  9. C++ 11新标准实现POJ No.2195-GoingHome
  10. PAT Advanced 1127 ZigZagging on a Tree (30) [中序后序建树,层序遍历]