[Django] drf filter过滤

自定义过滤方法

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表示精确匹配
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值