ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django restframework 帅选

2022-01-13 10:02:17  阅读:163  来源: 互联网

标签:帅选 rest django filter framework restframework filters Django class


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有