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. js 数组一些简单应用

    把两个数组连接成按从小到大的一个数组例如: var allowVlan = '23-25,45,4-6,67,50-53'; var unTagVlan = '1-5'; 完成时应该是1-6,23-2 ...

  2. Java8 Stream流

    第三章 Stream流 <Java8 Stream编码实战>的代码全部在https://github.com/yu-linfeng/BlogRepositories/tree/master ...

  3. javaWeb_Css

    CSS HTML页面实在太丑了,怎么破?! 第1章 CSS简介 CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML元素(或内容)在浏览器内的显示样式 ...

  4. 升级Kubernetes 1.18前,你不得不知的9件事

    本文来自Rancher Labs 昨天Kubernetes最新版本v1.18已经发布,其包含了38项功能增强,其中15项为稳定版功能.11项beta版功能以及12项alpha版功能.在本文中,我们将探 ...

  5. rbac权限+中间件 初识

    rbac权限+中间件 1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or ...

  6. Django 后台管理xadmin

    一. xadmin的使用 后台管理在开发中可以给我们提供很大的便利,django自带了一个后台管理admin,不过还有一个xadmin比django自带的好用一些,功能更加强大,为模型提供了版本控制, ...

  7. hdu3038加权(扩展)并查集

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3038/ 参考博客: https://blog.csdn.net/weixin_44580710/article/ ...

  8. hdu1175 连连看(bfs疯狂MLE和T,遂考虑dfs+剪枝)

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1175/ 题目大意就是给出地图,上面有若干的数,相当于连连看,给了q个查询,问给出的两个位置的数能否在两次转弯以内 ...

  9. Trie树-XOR-1695. Kanade的三重奏

    2020-03-18 21:58:18 问题描述: 给你一个数组A [1..n],你需要计算多少三元组(i,j,k)满足(i <j <k)和((A [i] xor A [j])<(A ...

  10. javaAPI操作ES分组聚合

    连接es的客户端使用的 TransportClient SearchRequestBuilder requestBuilder = transportClient.prepareSearch(indi ...