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语言程序设计(八) 数组

    第八章 数组 //L8-1 #include <stdio.h> int main() { int score1, score2, score3, score4, score5; int ...

  2. 在Windows中像Linux里一样使用CMake和make

    1. 安装GCC环境 1.1 安装MinGW(Minimalist GNU for Windows) 首先下载MinGW,并安装.安装完成之后运行MinGW Installer.界面如下.勾选自己需要 ...

  3. BJDCTF

    python3的模板注入 非常简单...就是直接执行命令就行..虽然过滤了flag,但是拼接下就好了.... payload: http://fd5883ee-b8e2-4bf1-88af-33936 ...

  4. 手把手构建LSTM的向前传播(Building a LSTM step by step)

      本篇是在之前两篇基础上接着写的: 吴恩达deepLearning.ai循环神经网络RNN学习笔记(理论篇) 从头构建循环神经网络RNN的向前传播(rnn in pure python) 也可以不看 ...

  5. spring动态添加bean

    不知道大家想过没有,我们使用mybatis的时候只要写接口和配置上一个sql语句就可以了,单从代码的角度来看,这是不合理的. 所以我们通常在service里面注入的mapper它其实是一个代理对象 ​ ...

  6. MyBatis框架——单表查询

    Mybatis单表查询,示例 1.创建数据库 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Versio ...

  7. 使用tomcat运行时提示some characters cannot be mapped using iso-8859-1 character encoding异常

    今天第一次使用java进行jsp项目搭建,也是第一次使用tomcat.tomcat是运行java web的一个小型服务器,属于Apache的一个开源免费的服务. 在运行web 的时候,我们就要先配置好 ...

  8. cin.getline()的用法和坑

    cin.getline()的用法和坑 cin.getline大致原型:**istream& getline (char* s, streamsize n, char delim='\n');* ...

  9. ReentrantLock源码解析——虽众但写

    在看这篇文章时,笔者默认你已经看过AQS或者已经初步的了解AQS的内部过程.   先简单介绍一下ReentantLock,跟synchronized相同,是可重入的重量级锁.但是其用法则相当不同,首先 ...

  10. coding++:高并发解决方案限流技术---漏桶算法限流--demo

    1.漏桶算法 漏桶作为计量工具(The Leaky Bucket Algorithm as a Meter)时,可以用于流量整形(Traffic Shaping)和流量控制(TrafficPolici ...