django-filter 查询

创建model和视图

from django.db import models

# Create your models here.

class Student(models.Model):
SEX_CHOICES = (
(0, '女'),
(1, '男')
)
name = models.CharField(max_length=10)
sex = models.SmallIntegerField(choices=SEX_CHOICES)
courses = models.ManyToManyField('Course')
teacher = models.ForeignKey('Teacher', on_delete=models.SET_NULL, null=True) def __str__(self):
return self.name class Teacher(models.Model):
name = models.CharField(max_length=10) def __str__(self):
return self.name class Course(models.Model):
name = models.CharField(max_length=10) def __str__(self):
return self.name
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.viewsets import ModelViewSet
from . import serializer
from . import models
from . import filter class StudentView(ModelViewSet):
queryset = models.Student.objects.all()
serializer_class = serializer.StudentSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = filter.StudentFilter
from django_filters.rest_framework import FilterSet
import django_filters
from . import models class StudentFilter(FilterSet):
# 原始查询 + lookup_expr查询表达式
name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
# choice查询
sex = django_filters.ChoiceFilter(choices=models.Student.SEX_CHOICES)
# 自定义choice value查询
sex_display = django_filters.CharFilter(method='get_sex_display') # 跨表查询
teacher = django_filters.CharFilter(field_name='teacher__name') class Meta:
model = models.Student
fields = '__all__' def get_sex_display(self, queryset, name, value):
# print(self.qs)
item = {i[1]: i[0] for i in models.Student.SEX_CHOICES}
sex_value = item.get(value, None)
if sex_value is not None:
condition = {'sex': sex_value}
return queryset.filter(**condition)
return queryset

定义filterset_fields

  • 在视图类定义属性filterset_fieldsfilterset_fields为一个列表或元祖,该字段中的元素为模型类对应的字段,然后在视图的url里面即可get传参查找

    -- 需要DjangoFilterBackend支持和django_filter支持

通用搜索

  • 在试图类定义属性search_fieldssearch_fields为一个列表或元祖,该字段中的元素为模型类对应的字段
  • 在url中使用关键字search中查找,即可找到所有search_fields匹配到的内容,关键字search字段可被定义的SEARCH_PARAM属性覆盖

    --需要SearchFilter支持

    --注意: search可支持扩表查询如user__details__name,但是search_fields里面的内容最终指向的都应该是字符串类型

详情:https://www.django-rest-framework.org/api-guide/filtering/

django-filter的基本使用的更多相关文章

  1. Django filter中用contains 在mysql中的问题

    用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如object.filter(tag__contains='keywords').... 在这种情况下,如果你跟踪 ...

  2. django filter or 多条件查询

    功能:django中实现多条件查询 或关系: from django.db.models import Q return qs.filter(Q(notice_to_group__contains=' ...

  3. 【Python】Django filter 如何支持 or 条件过滤?

    from django.db.models import Q Item.objects.filter(Q(creator=owner) | Q(moderated=False)) 代码示例: if(r ...

  4. Django模版中的过滤器详细解析 Django filter大全

    就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法. 过滤器看起来是这样的: {{ name|lower }} 显示的内容是变量 {{ name }} 被过滤器 lower 处 ...

  5. 关于Django ORM filter方法小结

    django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...

  6. django中的objects.get和objects.filter方法的区别

    为了说明它们两者的区别定义2个models class Student(models.Model): name = models.CharField('姓名', max_length=20, defa ...

  7. django model的get和filter方法的区别

    django的get方法: 1django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错. 2如果你用django的get去取得关联表的数据的话,而关键表的数据 ...

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

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

  9. Django REST Framework 最佳实践

    Django REST framework 是一个强大且灵活的工具包,用以构建Web APIs. 为什么要使用REST framework? - 在线可视的API,对于赢得你的开发者们十分有用 - 验 ...

  10. django-models的get与filter

    为了说明它们两者的区别定义2个models class Student(models.Model):name = models.CharField('姓名', max_length=20, defau ...

随机推荐

  1. C语言程序设计(十一) 指针和数组

    第十一章 指针和数组 一旦给出数组的定义,编译系统就会为其在内存中分配固定的存储单元,相应的,数组的首地址也就确定了 C语言中的数组名有特殊的含义,它代表存放数组元素的连续存储空间的首地址 //L11 ...

  2. 面试官:HashMap死循环形成的原因是什么?

    介绍 HashMap实现原理 之前的文章已经分析了HashMap在JDK1.7的实现,这篇文章就只分析HashMap死循环形成的原因 死循环形成是在扩容转移元素的时候发生的 void resize(i ...

  3. Python专题——详解enumerate和zip

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第7篇文章,我们继续介绍迭代相关. enumerate 首先介绍的是enumerate函数. 在我们日常编程的过程当 ...

  4. 最大比率传输(Maximum Ratio Transmission, MRT)原理分析

    转载请注明出处. 最大比率发射(Maximum Ratio Transmission, MRT)是文献中经常看见的一个词,今天就在这里做一下笔记. 参考文献为:T. K. Y. Lo, "M ...

  5. 【2019牛客暑期多校第一场】E题ABBA

    题目链接 大致题意 有(n+m)(n + m)(n+m)个字母A和(n+m)(n + m)(n+m)个字母B,组成一个长度为 2∗(n+m)2*(n + m)2∗(n+m)的字符串,并且使得字符串中有 ...

  6. 从数据结构分析mysql为何使用B+tree

    理解mysql为何选择升级版的二叉树,就需要对各种常用的二叉树进行对比.B+Tree是一种特殊的二叉树,本质上也算二叉树.自然会满足二叉树的一般特性. 比如,比节点数据大的在右边,节点数据小的在左边. ...

  7. 动态规划/MinMax-Stone Game

    2019-09-07 16:34:48 877. Stone Game 问题描述: 问题求解: 典型的博弈问题,也是一个典型的min-max问题.通常使用算diff的方法把min-max转为求max. ...

  8. JSOI 2016 病毒感染 辅助Dp问题

    原题链接:https://www.luogu.com.cn/problem/P5774 分析 直接看这道题,第一个困惑点,那个绝对值的比较是什么东西,根据数学知识,我们可以知道这个意思是k到i的距离小 ...

  9. 使用 NLTK 对文本进行清洗,索引工具

    使用 NLTK 对文本进行清洗,索引工具 EN_WHITELIST = '0123456789abcdefghijklmnopqrstuvwxyz ' # space is included in w ...

  10. Java基础语法(9)-面向对象之类的成员

    title: Java基础语法(9)-面向对象之类的成员 blog: CSDN data: Java学习路线及视频 1.面向对象特征--封装 为什么需要封装?封装的作用和含义? 我要用洗衣机,只需要按 ...