django-filter的基本使用
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_fields,filterset_fields为一个列表或元祖,该字段中的元素为模型类对应的字段,然后在视图的url里面即可get传参查找
-- 需要DjangoFilterBackend支持和django_filter支持
通用搜索
- 在试图类定义属性
search_fields,search_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的基本使用的更多相关文章
- Django filter中用contains 在mysql中的问题
用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如object.filter(tag__contains='keywords').... 在这种情况下,如果你跟踪 ...
- django filter or 多条件查询
功能:django中实现多条件查询 或关系: from django.db.models import Q return qs.filter(Q(notice_to_group__contains=' ...
- 【Python】Django filter 如何支持 or 条件过滤?
from django.db.models import Q Item.objects.filter(Q(creator=owner) | Q(moderated=False)) 代码示例: if(r ...
- Django模版中的过滤器详细解析 Django filter大全
就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法. 过滤器看起来是这样的: {{ name|lower }} 显示的内容是变量 {{ name }} 被过滤器 lower 处 ...
- 关于Django ORM filter方法小结
django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...
- django中的objects.get和objects.filter方法的区别
为了说明它们两者的区别定义2个models class Student(models.Model): name = models.CharField('姓名', max_length=20, defa ...
- django model的get和filter方法的区别
django的get方法: 1django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错. 2如果你用django的get去取得关联表的数据的话,而关键表的数据 ...
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- Django REST Framework 最佳实践
Django REST framework 是一个强大且灵活的工具包,用以构建Web APIs. 为什么要使用REST framework? - 在线可视的API,对于赢得你的开发者们十分有用 - 验 ...
- django-models的get与filter
为了说明它们两者的区别定义2个models class Student(models.Model):name = models.CharField('姓名', max_length=20, defau ...
随机推荐
- git基础教程(八)
8. gitlab相关介绍 8.1 gitlab优势 社区版本,自己可以在公司搭建环境 维护人员多,版本更新块 易用性强,上手快 集成CI(持续集成) 集成CD(持续发布) 8.2 持续集成 8.2. ...
- Gorm 预加载及输出处理(二)- 查询输出处理
上一篇<Gorm 预加载及输出处理(一)- 预加载应用>中留下的三个问题: 如何自定义输出结构,只输出指定字段? 如何自定义字段名,并去掉空值字段? 如何自定义时间格式? 这一篇先解决前两 ...
- XSS(跨站脚本攻击)详解
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web ...
- Flask wtforms 表单验证使用
目录 wtforms 使用1(简单版): 使用2(复杂版): wtforms 安装:pip3 install wtforms 使用1(简单版): from flask import Flask, re ...
- 【原创】基于RBI的性能测试理念,通过jmeter快速定位接口最大并发用户数
测试工具:jmeter v_5.2 测试对象:某网站的物料获取接口,需登录后操作 测试目的:快速定位该接口最大并发用户数 思路&步骤: 1.模拟一个场景,某天临近下班,主管突然过来让你测下你们 ...
- [Docker8]Dockerfiles
Comment INSTRUCTION arguments FROM 基于哪个base镜像 RUN 执行命令并创建新的镜像层,run经常用于安装软件包 MAINTAINER 镜像创建者 copy 将文 ...
- BIT-Reverse Pairs
2019-12-17 11:07:02 问题描述: 问题求解: 本题可以看作是逆序数问题的强化版本,需要注意的是num[i] > 2 * num[j],这里有0和负数的情况. public in ...
- Contest 155
2019-09-27 22:39:24 总体感受:这次比赛心态不够好,最后导致没有很好的完成比赛. 注意点: 1)保持心态稳定,是情商的体现: 2)hard题的覆盖还是明显不够: 1201. Ugly ...
- RNN,GRU,LSTM
2019-08-29 17:17:15 问题描述:比较RNN,GRU,LSTM. 问题求解: 循环神经网络 RNN 传统的RNN是维护了一个隐变量 ht 用来保存序列信息,ht 基于 xt 和 ht- ...
- Javascript函数之深入浅出递归思想
一.递归函数的理解 1.生活中的递归 "递归"在生活中的一个典例就是"问路".如图小哥哥进入电影院后找不到自己的座位,问身边的小姐姐"这是第几排&qu ...