六、python Django REST framework GET参数处理[过滤、排序、分页]

django 3.2.13

一、过滤

解释:过滤其实就是应用于ListModelMixin其为所有内容对其进行过滤的,需要专门安装注册,如127.0.0.1:8000/books/?gid=88,在所有内容里面得到gid为88的内容

1.基础(不推荐)

安装:pip install django-filter

配置:

INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

# 不写入到setting.py里面,写入到views.py视图里,写法如下
# filter_backends = DjangoFilterBackend

使用:

class TestGenericAPIView(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    filterset_fields = ['id' ,'time', 'foreign_id']

2.复杂操作

2.1 自带查询[模糊查询、大小查询]

2.1.1 模糊查询

filter.py
解释:exact表示精确查询,icontains表示模糊查询(都在列表表示都可以用)

用法:精确-http://127.0.0.1:8000/tea/?passwd=3543;模糊-http://127.0.0.1:8000/tea/?passwd__icontains=35

import django_filters
from testWeb.models import Student

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = Student
        fields = {
            "passwd": ['exact','icontains'],
            "time": ['exact'],
        }

views.py

class TestGenericAPIView(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    filterset_class= UserFilter
2.1.2 大小查询

解释:gt表示大于、lt表示小于、gte表示大于等于和lte表示小于等于
用法:http://127.0.0.1:8000/tea/?time__lt=446660

import django_filters
from testWeb.models import Student

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = Student
        fields = {
            "passwd": ['exact','icontains'],
            "time": ['exact','gte','lte'],
        }
2.1.3 字段在某列表

解释:in表示在列表
用法:http://127.0.0.1:8000/tea/?time__in=446654,334534534

import django_filters
from testWeb.models import Student

class UserFilter(django_filters.FilterSet):

    class Meta:
        model = Student

        fields = {
            "passwd": ['exact','icontains'],
            "time": ['exact','in'],
        }

2.2 自定义查询

字段:

CharFilter         字符串类型
BooleanFilter      布尔类型
DateTimeFilter     日期时间类型
DateFilter         日期类型
DateRangeFilter    日期范围
TimeFilter         时间类型
NumberFilter       数值类型,对应模型中IntegerField, FloatField, DecimalField

属性:

field_name: 过滤字段名,一般应该对应模型中字段名
lookup_expr: 查询时所要进行的操作,和ORM中运算符一致
method:指定某个方法去运算,值为函数名

用法:http://127.0.0.1:8000/tea/?path=7

import django_filters
from django_filters import filters
from testWeb.models import Student
class UserFilter(django_filters.FilterSet):
    path = filters.CharFilter(field_name='id', lookup_expr='gt')
    class Meta:
        model = Student
        fields = {
            "passwd": ['exact','icontains'],
            "time": ['exact','gt','lt','in','isnull'],
        }

用法:http://127.0.0.1:8000/tea/?abc=8

import django_filters
from django_filters import filters

from testWeb.models import Student

class UserFilter(django_filters.FilterSet):
    abc = filters.NumberFilter(field_name='id', method='abcd')


    def abcd(self,queryset, name,value):# queryset是对应着view里面的那个,name是调用该函数处理的字段,value是用户提交的值
        value = value +1
        e = Student.objects.filter(id=value)
        return e

二、排序

解释:其是使用过滤的方法,其使用rest_framework过滤里面的排序

使用:http://127.0.0.1:8000/tea/?ordering=-id # -号表示逆序,不加符号表示正序

class TestGenericAPIView(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

    filter_backends = [OrderingFilter] # 这里不配置,就需要去setting.py里面配置
    ordering_fields = ('id', )

三、分页

基础分页类:

  • PageNumberPagination 简单分页器-普通的分页工作
  • 请求格式:http://127.0.0.1:8000/tea/?page=1&page_size=2# page表示第几页,page_size表示一页显示几个
    • page_size 每页数目(这里用来设置默认的,一般不用)
    • page_query_param 前端请求的页数关键字名,默认为"page"
    • page_size_query_param 前端请求的每页数目关键字名,默认为"page_size"
    • max_page_size 前端最多能设置的每页数量
  • LimitOffsetPagination 偏移分页器-可设置查询起点-其查询模式是PageNumberPagination 的基础
  • 请求格式:http://127.0.0.1:8000/tea/?limit=2&offset=2 # limit表示每次查多少,offset表示隔开几个开始查
    • default_limit 默认限制,默认值与page_size设置一样
    • limit_query_param limit参数名,默认’limit’
    • offset_query_param offset参数名,默认’offset’
    • max_limit 最大limit限制

使用方法:

解释:如果配置全局就无需专门写入局部配置,同理配置局部无需专门写入全局,理由(django在APIView父类里面默认会读取全局配置的,如果局部写相当于覆盖全局配置)

  • 全局配置(不推荐):
    • 写入setting.py文件
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}
  • 局部配置:
    • 写入views.py
      导入:from rest_framework.pagination import PageNumberPagination
class LargeResultsSetPagination(PageNumberPagination):
    page_size = 2
    page_size_query_param = 'page_size'
    max_page_size = 2
class TestGenericAPIView(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    pagination_class = LargeResultsSetPagination

你可能感兴趣的:(#,Python,Django学习,django,python,后端)