其他分享
首页 > 其他分享> > Django restframework 帅选

Django restframework 帅选

作者:互联网

1、安装django-filter

pip install django-filter

2、注册django-filter

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'rest_framework',
    'django_filters',  #注册django-filter
]

3、设置通用过滤后端
全局配置

REST_FRAMEWORK = {

    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)

}

局部视图设置

import django_filters.rest_framework 

class BookView(GenericViewSet):

    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)

4、指定筛选字段
如果需求都是些简单类型的筛选,那么可以在view或viewSet里面设置一个filter_fields属性,列出所有依靠筛选的字段集合。

import django_filters.rest_framework
from rest_framework.viewsets import ModelViewSet

class BookView(ModelViewSet):

...    
    filter_fields = ('title',) #列出搜索字段
...

5、进行访问
路由配置

from rest_framework import routers
router=routers.DefaultRouter()
router.register('books',views.BookView) #无需base_name参数
urlpatterns = [
        re_path('',include(router.urls)),
]

(二)FilterSet的简单使用
上面所搜索的字段是一对一的关系,没有涉及到外键以及多对多字段,如果有外键或者多对多关系,可以在filter_fields中使用‘__’进行跨越:

class BookView(ModelViewSet):

    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
    # 列出搜索字段,其中publish__name为ForeignKey字段,authors__name为ManyToMany字段
    filter_fields = ('title','publish__name','authors__name') 



class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.IntegerField()
    pub_date=models.DateField(null=True,blank=True)
    publish=models.ForeignKey("Publish",on_delete=models.CASCADE)
    authors=models.ManyToManyField("Author")
    def __str__(self):
        return self.title

此时请求地址:

#含外键
http://127.0.0.1:8020/books/?title=语文&publish__name=北京出版社

#含多对多
http://127.0.0.1:8020/books/?title=语文&publish__name=北京出版社&authors__name=张三

但这样外键和多对多将Django的双下划线约定作为API的一部分暴露出来。如果想显式地命名过滤器参数,可以显式地将它包含在FilterSet类中:

1、定义FilterSet类

import django_filters
from app01 import models

class BookFilter(django_filters.rest_framework.FilterSet):
    publish = django_filters.CharFilter(field_name="publish__name")
    authors = django_filters.CharFilter(field_name="authors__name")
    class Meta:
        model = models.Book
        fields = ['title', 'publish', 'authors']

2、在视图中使用定义的FilterSet类

class BookView(ModelViewSet):

    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
    filter_class = BookFilter #使用定义的FilterSet类
此时请求地址:

http://127.0.0.1:8020/books/?title=语文&publish=北京出版社&authors=张三

三、其它过滤
(一)搜索过滤(SearchFilter)
支持基于简单查询参数的搜索,并且基于Django admin的搜索功能。

设置过滤后端

from rest_framework import filters

class BookView(ModelViewSet):

...
    filter_backends = (filters.SearchFilter,)
...

设置查询字段

from rest_framework import filters

class BookView(ModelViewSet):

    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    # filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
    filter_backends = (filters.SearchFilter,)

   #凡是以下字段内容都会被搜到
    search_fields = ('title','publish__name','authors__name')

当然可以通过在search_fields 前面添加各种字符来限制搜索行为:

'^' 以指定内容开始.

'=' 完全匹配

'@' 全文搜索(目前只支持Django的MySQL后端)

'$' 正则搜索

例如:

search_fields = ('=title',)
客户端访问
#将北京出版社的内容全部搜索出来
http://127.0.0.1:8020/books/?search=北京出版社
#将张三相关内容搜索出来
http://127.0.0.1:8020/books/?search=张三
通过关键词search进行搜索,可以搜索后端search_fields提供字段的内容。

SearchFilters类的默认搜索关键字为search,可以通过SEARCH_PARAM进行覆盖设置

class BookView(ModelViewSet):
...
    SEARCH_PARAM = 'ss'
...

(二)排序筛选(OrderingFilter)
设置排序筛选后端



from rest_framework import filters

class BookView(ModelViewSet):

...
    filter_backends = (filters.OrderingFilter,)
...

指定支持排序的字段(ordering_fields )

from rest_framework import filters

class BookView(ModelViewSet):
...
    filter_backends = (OrderingFilter,)
    ordering_fields = ('title', 'id') #指定支持排序的字段
...

客户端访问
通过关键字ordering请求返回的数据按照什么排序

#按照title排序
http://127.0.0.1:8020/books/?ordering=title

#按照id排序
http://127.0.0.1:8020/books/?ordering=id
#按照id逆序
http://127.0.0.1:8020/books/?ordering=-id

#按照多个字段排序
http://127.0.0.1:8020/books/?ordering=id,title

默认排序
如果需要在返回的数据中已经排好序了,可以在视图中使用ordering参数:

from rest_framework import filters

class BookView(ModelViewSet):

    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    filter_backends = (filters.OrderingFilter,)
    ordering_fields = ('title', 'id')
    ordering=('-id',) #默认排序

客户端访问:

    http://127.0.0.1:8020/books/
返回的是已经按照id逆序排列的数据。

转载于:https://www.cnblogs.com/shenjianping/p/11511978.html

标签:帅选,rest,django,filter,framework,restframework,filters,Django,class
来源: https://blog.csdn.net/weixin_43632687/article/details/122467159