django drf (过滤、搜索、排序、分页)

django drf (过滤、搜索、排序、分页)

1.过滤

  1. 参考官网:https://django-filter.readthedocs.io/en/master/guide/install.html

  2. 在写django drf的时候会遇到搜索,以及过滤的情况。django-filter就可以很好的满足我们。

  3. 本篇文章写的并不复杂,主要让读者入门,然后阅读官网进阶

  4. pip安装
    pip install django-filter

  5. 安装完之后,加入到 INSTALLED_APPS
    INSTALLED_APPS = [

    ‘django_filters’,
    ]

  6. 建立一个filter.py文件名字自定义

  7. filter.py
    import django_filters
    from .models import RegistrationManager #RegistrationManager:models数据库

    class RegistrationManagerFilter(django_filters.FilterSet):
        # field_name :数据库字段名字 ,lookup_expr:参数
        min_date = django_filters.DateFilter(field_name='time', lookup_expr='gte')
        max_date = django_filters.DateFilter(field_name='time', lookup_expr='lte')
        #min_date,max_date:时间过滤
    
        class Meta:
            model = RegistrationManager
            # fields = '__all__'
            fields = ['id', 'department', 'doctor', 'min_date', 'max_date']
            models:指定数据库
            fields:指定数据库的字段名
    
  8. views.py
    from rest_framework.viewsets import ModelViewSet
    from django_filters.rest_framework import DjangoFilterBackend
    from django_filters import rest_framework
    from .filter import RegistrationManagerFilter#自己创的文件

    class RegistrationManagerView(ModelViewSet):
        queryset = RegistrationManager.objects.all().order_by()
        serializer_class = RegistrationManagerSerializer
        filter_backends = (rest_framework.DjangoFilterBackend, )  
        filter_class = RegistrationManagerFilter
        #添加filter_backends并设置  
        #并且把filter的class加入到filter_calss就可以了
    
  9. 运行结果
    django drf (过滤、搜索、排序、分页)_第1张图片

2.搜索,过滤

  1. 和过滤一样,下载django-filter并加入到INSTALLED_APPS中

  2. 接续编写views.py
    from rest_framework.viewsets import ModelViewSet
    from django_filters.rest_framework import DjangoFilterBackend
    from django_filters import rest_framework
    from .filter import RegistrationManagerFilter#自己创的文件

    class RegistrationManagerView(ModelViewSet):
        queryset = RegistrationManager.objects.all().order_by()
        serializer_class = RegistrationManagerSerializer
        filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter,filters.OrderingFilter,) 
        filter_class = RegistrationManagerFilter
        search_fields = ('name', 'id', 'department__patient_name', 'doctor__username')
        ordering_fields = ('name', 'first_visit', 'state', 'id')
        #如果有外键,在search_fields中加入一个外键的名字是不能查询的,要写成(外键名__外键中的字段名)
        
     	#和过滤不一样的是,需要加入filters.SearchFilter,filters.OrderingFilter
     	#filters.SearchFilter:用于搜索
     	#filters.OrderingFilter:用于排序
     	#ordering_fields:可以设置排序方式
     	
     	
     	#当然搜索也可以进行设置
     		#‘^’:以 xx 字符串开始
    		#‘=’:完全匹配
    		#‘@’:全文搜索(目前只支持Django的MySQL后端)
    		#$表示以什么结尾
    		#‘$’:正则表达式搜索
    
  3. 搜索的时候,经常会遇到外键,表之间的关系所以需要简单的处理一下,如果有外键,在search_fields中加入一个外键的名字是不能查询的,要写成(外键名__外键中的字段名)

  4. 效果图
    django drf (过滤、搜索、排序、分页)_第2张图片

3.接写来就是分页啦

  1. 分页还是很简单的
  2. 在setting.py加入以下代码即可
    REST_FRAMEWORK = {
    ‘DEFAULT_PAGINATION_CLASS’: ‘rest_framework.pagination.PageNumberPagination’,
    ‘PAGE_SIZE’: 100 # 每页数目
    }

还可以自定义传统分页类 - 重写 PageNumberPagination,不过现在还没用到就先不写了

你可能感兴趣的:(Django)