过滤器django-filter的使用

本文介绍了如何在Django项目中使用django-filter库实现复杂的查询和过滤功能,包括定义FilterSet类、指定查询条件和外键关系,以及在View函数中集成这些过滤器,以提高数据列表的可操作性。
摘要由CSDN通过智能技术生成

当一个model的对象很多的时候,查询或过滤功能显得尤为重要,好在Django给我们提供了功能强大的django-filter。

准备工作

pip install django-filter

在settings.py中

增加'django_filters'到INSTALLED_APPS数组

INSTALLED_APPS = [
    'simpleui',   
    'ckeditor',
    'ckeditor_uploader',    
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'django_filters',
    ...
]

REST_FRAMEWORK设置如下:

REST_FRAMEWORK = {

   # 过滤器默认后端

    'DEFAULT_FILTER_BACKENDS': (

           'django_filters.rest_framework.DjangoFilterBackend',),

}

定义filter类

所有filter类都继承自filters.FilterSet

class ProjectFilter(filters.FilterSet):
    code = filters.CharFilter(lookup_expr='icontains')
    owner = filters.ModelMultipleChoiceFilter(queryset=User.objects.all(),field_name="owner")
    creater = filters.ModelMultipleChoiceFilter(queryset=User.objects.all(),field_name="creater")
    isp = filters.ModelMultipleChoiceFilter(
        queryset=Organization.objects.filter( organizationType = OrganizationType_enum["isp"].value),field_name="program__isp")
    class Meta:
        model = Project
        fields = ['code',]

在class Meta中指定model为Project。

code为charField类型,所以可以定义搜索类型为icontains,即为大小写不敏感(见63.ORM查询条件详解:contains和icontains-CSDN博客

owner和creater为指向User模型的外键,可以进行多选,所以filter类型为ModelMultipleChoiceFilter,并且要指定queryset和field_name。

最后再看isp,和owner不一样的是field_name,为program__isp(两个下划线)。

这里涉及到3个model,Project,Program,Organization。

其中Project中有program外键指向Program,Program中有isp外键指向Organization,program__isp指的就是Project中program的isp。

View函数中使用

@login_required(login_url='/accounts/login/')
def view_project_list(request,program_id):
    try:
        userObj = request.user
        program_list = Program.objects.all()
        projects_with_perm = get_objects_for_user(userObj, 'view_project',klass=Project) 
        if program_id == "all":
            program = "all"
            projects = projects_with_perm.all()
        else:
            program = Program.objects.get(id = program_id)  
            projects = projects_with_perm.filter(program__id = program_id)

        filter = ProjectFilter(request.GET, queryset=projects)
        split_data = split_page(filter.qs,request)       

        return render(request, 'project/project_list.html', {
                'filter':filter,
                'split_data':split_data,     
                'program_list':program_list,
                'program':program,      
                'program_id':program_id
            })
    except Exception as err:
        return handle_error(request,err) 

在html中显示

定义一个modal模态框显示所有的过滤条件

<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" id="ModalForm_filter" >
    <div class="modal-dialog modal-lg" role="document"> 
        <form action="" method="get" class="form form-inline">     
            <div class="modal-content">
                <div class="modal-header">
                    <h4 class="modal-title" id="myModalLabel">过滤条件</h4>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <div class="col-sm-12 filter_div">
                            {{ filter.form.as_p }}
                        </div>
                    </div>   
                </div>
                <div class="modal-footer" text-center>
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>     
                    <button class="btn btn-primary "> <span class="glyphicon glyphicon-filter"></span> 确定</button>                
                </div>
            </div>
        </form>
    </div>
</div>

 效果如下:

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值