自定义过滤方法
import django_filters
from household_register.models import ApplyModel
class ApplyFilter(django_filters.rest_framework.FilterSet):
depts = django_filters.CharFilter(method='filter_depts')
#获取其他请求参数
#rylb = self.request.query_params.get('rylb', 'all')
class Meta:
model = ApplyModel
fields = []
def filter_depts(self, queryset, name, value):
from user.models import DeptModel
if value:
dept_ids = value.strip().strip(',').split(',')
depts = []
for dept_id in dept_ids:
dept = DeptModel.objects.get(id=dept_id)
depts.extend(dept.children_ids())
queryset = queryset.filter(user__dept__in=depts)
return queryset
时间字段范围过滤
xx 为后端时间字段,前端传值参数为起始时间:xx_after,结束时间:xx_before
from django_filters.rest_framework import (
FilterSet,
CharFilter,
DateTimeFromToRangeFilter,
)
from apps.logs.models import LoginLog
class LoginLogFilter(FilterSet):
# create_time_before=2021-09-31%2017:10:02&create_time_after=2021-09-30%2017:01:02
create_time = DateTimeFromToRangeFilter('create_time')
username = CharFilter(field_name='username', lookup_expr="icontains")
class Meta:
model = LoginLog
fields = ['create_time', 'username']
外键关联方向过滤
业务场景:在书店列表中,筛选出书名为水浒传的书信息
书店model,一个书店有多本书籍
class BookStore(models.Model):
name= models.CharField(max_length=128, unique=True, verbose_name="书店名称")
书籍model,一本书籍只属于一个书店
class Book(models.Model):
book_store= models.ForeignKey('Bookstore', to_field='order_sn', on_delete=models.CASCADE,related_name='books',
verbose_name='书店')
name= models.CharField(max_length=128, unique=True, verbose_name="书名")
过滤可以这样写,使用related_name 反向查询
import django_filters
from django_filters.rest_framework import FilterSet
from models import BookStore
class BookStoreFilter(FilterSet):
name= django_filters.CharFilter(field_name='books__name' )
过滤 lookup_expr判断条件可选参数
# lookup_expr(可选)为判断条件,field_name(必选)为模型类属性,created_time查询字符串
created_time= django_filters.CharFilter(field_name='created_at', lookup_expr='startswith')
created_start_time = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='gte') # 大于等于
created_end_time = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='lte') # 小于等于
problem_isnull = django_filters.BooleanFilter(field_name='problem', lookup_expr='isnull')
name = django_filters.CharFilter(lookup_expr='iexact') # iexact表示精确匹配, 并且忽略大小写
author = django_filters.CharFilter(lookup_expr='icontains') #icontains表示模糊查询(包含),并且忽略大小写
price = django_filters.NumberFilter(look_expr='exact') #exact表示精确匹配