当前位置: 首页 > wzjs >正文

做公司网站需要什么广州百度seo 网站推广

做公司网站需要什么,广州百度seo 网站推广,做公众号网站,国家工商总局官网入口目录 前情回顾 方法一: 重写get_queryset方法 方法二: 使用django-filter 安装django-filter 自定义FilterSet类 方法三: 使用SearchFilter类 自定义SearchFilter类 排序OrderingFilter类 在前面的DRF系列教程中,我们以博客为例介绍了序列化器(Serializer),…

目录

前情回顾

方法一: 重写get_queryset方法

方法二: 使用django-filter

安装django-filter

自定义FilterSet类

方法三: 使用SearchFilter类

自定义SearchFilter类

排序OrderingFilter类


在前面的DRF系列教程中,我们以博客为例介绍了序列化器(Serializer), 并使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API端点,并详细对权限、认证(含jwt认证)和分页进行了总结与演示。在本篇文章中我们将向你演示如何在Django REST Framework中对分页结果进行进一步过滤和排序。

前情回顾

前面教程中当你发送GET请求到/v1/articles?page=2时可以得到下面返回的分页数据列表。现在我们希望对结果进行进一步过滤,比如返回标题含有关键词django的文章资源列表。我们到底该怎么做呢? 本例中小编我将演示三种过滤方法, 你可以根据实际项目开发需求去使用。

img

方法一: 重写get_queryset方法

此方法不依赖于任何第三方包, 只适合于需要过滤的字段比较少的模型。比如这里我们希望对文章title进行过滤,我们只需要修改ArticleList视图函数类即可。

# blog/views.pyfrom rest_framework import generics
from rest_framework import permissions
from .permissions import IsOwnerOrReadOnly
from .pagination import MyPageNumberPaginationclass ArticleList(generics.ListCreateAPIView):serializer_class = ArticleSerializerpermission_classes = (permissions.IsAuthenticatedOrReadOnly,)pagination_class = MyPageNumberPaginationdef get_queryset(self):keyword = self.request.query_params.get('q')if not keyword:queryset = Article.objects.all()else:queryset = Article.objects.filter(title__icontains=keyword)return queryset# associate user with article author.def perform_create(self, serializer):serializer.save(author=self.request.user)

修改好视图类后,发送GET请求到/v1/articles?page=1&q=django, 你将得到所有标题含有django关键词的文章列表,这里显示一共有3条结果。

img

注意:DRF中你通过request.query_params获取GET请求发过来的参数,而不是request.GET。如果你希望获取从URL里传递的参数,你可以使用self.kwargs['param1']

假如你的URL配置如下所示:

re_path('^articles/(?P<username>.+)/$', AricleList.as_view()),

在视图中你可以通过self.kwargs['username']获取URL传递过来的用户名。

class ArticleList(generics.ListAPIView):serializer_class = ArticleSerializerdef get_queryset(self):"""按用户名查询发表文章清单"""username = self.kwargs['username']return Article.objects.filter(author__username=username)

当一个模型需要过滤的字段很多且不确定时(比如文章状态、正文等等), 重写get_queryset方法将变得非常麻烦,更好的方式是借助django-filter这个第三方库实现过滤。

方法二: 使用django-filter

django-filter库包含一个DjangoFilterBackend类,该类支持REST框架的高度可定制的字段过滤。这也是小编推荐的过滤方法, 因为它自定义需要过滤的字段非常方便, 还可以对每个字段指定过滤方法(比如模糊查询和精确查询)。具体使用方式如下:

安装django-filter

pip install django-filter

django_filters添加到INSTALLED_APPS中去。

INSTALLED_APPS = [...,django_filters,
]

接下来你还需要把DjangoFilterBackend设为过滤后台。你可以在settings.py中进行全局配置。

REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

还可以在单个视图中使用它。

from django_filters import rest_frameworkclass ArticleList(generics.ListCreateAPIView):# new: filter backends and classesfilter_backends = (rest_framework.DjangoFilterBackend,)

在类视图中使用django-filter时,你可以直接通过filterset_fields设置希望过滤的字段,如下所示:

from django_filters import rest_frameworkclass ArticleList(generics.ListCreateAPIView):# new: filter backends and classesfilter_backends = (rest_framework.DjangoFilterBackend,)filterset_fields = ['title', 'status']

如果你希望进行更多定制化的行为,你需要自定义FilterSet类,然后指定filter_class

自定义FilterSet类

新建blog/filters.py, 添加如下代码:

import django_filters
from .models import Articleclass ArticleFilter(django_filters.FilterSet):q = django_filters.CharFilter(field_name='title', lookup_expr='icontains')class Meta:model = Articlefields = ('title', 'status')

接下来通过filter_class使用它。

# New for django-filter
from django_filters import rest_framework
from .filters import ArticleFilterclass ArticleList(generics.ListCreateAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializerpermission_classes = (permissions.IsAuthenticatedOrReadOnly,)pagination_class = MyPageNumberPagination# new: filter backends and classesfilter_backends = (rest_framework.DjangoFilterBackend,)filter_class = ArticleFilter# associate request.user with author.def perform_create(self, serializer):serializer.save(author=self.request.user)

发送GET请求到/v1/articles?page=2&q=django&status=p, 你将得到如下返回结果,只包含发表了的文章。

img

你还可以看到REST框架提供了一个新的Filters下拉菜单按钮,可以帮助您对结果进行过滤(见上图标红部分)。

方法三: 使用SearchFilter类

其实DRF自带了具有过滤功能的SearchFilter类,其使用场景与Django-filter的单字段过滤略有不同,更侧重于使用一个关键词对模型的某个字段或多个字段同时进行搜索。

使用这个类,你还需要指定search_fields, 具体使用方式如下:

from rest_framework import filtersclass ArticleList(generics.ListCreateAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializerpermission_classes = (permissions.IsAuthenticatedOrReadOnly,)pagination_class = MyPageNumberPagination# new: add SearchFilter and search_fieldsfilter_backends = (filters.SearchFilter, )search_fields = ('title',)# associate request.user with author.def perform_create(self, serializer):serializer.save(author=self.request.user)

发送GET请求到/v1/articles?page=1&search=django, 你将得到如下结果。注意:这里进行搜索查询的默认参数名为?search=xxx。

img

SearchFilter类非常有用,因为它不仅支持对模型的多个字段进行查询,还支持ForeinKey和ManyToMany字段的关联查询。按如下修改search_fields, 就可以同时搜索标题或用户名含有某个关键词的文章资源列表。修改好后,作者用户名里如果有django,该篇文章也会包含在搜索结果了。

search_fields = ('title', 'author__username')

默认情况下,SearchFilter类搜索将使用不区分大小写的部分匹配(icontains)。你可以在search_fields中添加各种字符来指定匹配方法。

  • ’^’开始 - 搜索。
  • ’=’完全匹配。
  • ’@’全文搜索。
  • ’$’正则表达式搜索。

例如:search_fields = (‘=title’, )精确匹配title。

自定义SearchFilter类

默认SearchFilter类仅支持?search=xxx这个传递参数,你可以通过设置SEARCH_PARAM覆盖。另外你还可以重写get_search_fileds方法改变它的行为。下例中,当你按照/?search=keyword&title_only=True提交请求时,它将只针对title进行查询。

from rest_framework import filtersclass CustomSearchFilter(filters.SearchFilter):def get_search_fields(self, view, request):if request.query_params.get('title_only'):return ['title']return super(CustomSearchFilter, self).get_search_fields(view, request)

前面我们详细介绍了对结果进行过滤的3种方法,接下来我们再看看如何对结果进行排序,这里主要通过DRF自带的OrderingFilter类实现。

排序OrderingFilter类

使用OrderingFilter类首先要把它加入到filter_backends, 然后指定排序字段即可,如下所示:

from rest_framework import filtersclass ArticleList(generics.ListCreateAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializerpermission_classes = (permissions.IsAuthenticatedOrReadOnly,)pagination_class = MyPageNumberPaginationfilter_backends = (filters.SearchFilter, filters.OrderingFilter,)search_fields = ('title',)ordering_fields = ('create_date')

发送请求时只需要在参数上加上?ordering=create_date或者?ordering=-create_date即可实现对结果按文章创建时间正序和逆序进行排序。

点击DRF界面上的Filters按钮,你还会看到搜索和排序的选项。

img

注意:实际开发应用中OrderingFilter类,SearchFilter类和DjangoFilterBackend经常一起联用作为DRF的filter_backends,没有相互冲突。

http://www.dtcms.com/wzjs/66291.html

相关文章:

  • 网站制作的公司有哪些湖南手机版建站系统开发
  • 口碑最好的旅游网站建站开发
  • 有关于做茗茶的网站百度售后电话人工服务
  • 霸州市建设局网站网络推广主要工作内容
  • 为什么要做个人网站四川seo
  • 淘宝上开做网站的店铺百家号关键词排名
  • 昆明网站运营公司有哪些网站排名top排行榜
  • 幼儿教育网站源码网站建设需求模板
  • 兴义建设局网站今日全国疫情最新消息
  • 自己能做app软件吗网站优化技术
  • 网站建设 技术架构广州网站运营专业乐云seo
  • wordpress 筛选 插件重庆网站优化公司
  • 张店网站建设方案百家号官网
  • 移动网站建设哪家快2345网址导航智能主板
  • 上海嘉定建设局官方网站江北关键词优化排名seo
  • 用uc看不健康的东西会中病毒吗宁波seo软件
  • 顺德制作网站制作网页的代码
  • 网站运营规划东莞seo黑帽培训
  • 小程序开发一般多少钱宝鸡百度seo
  • 分销pc网站设计本网站
  • 做ps图标什么网站最好宁波正规seo快速排名公司
  • 炫彩发光字制作免费网站网络营销主要有哪些特点
  • 微网站开发一般费用多少钱百度识图在线
  • 自己的网站怎么能让百度搜出来免费开源网站
  • 网站没有备案用什么cdn搜索引擎优化策略包括
  • 网站生成海报功能怎么做百度95099如何转人工
  • 做电影网站用什么服务器百度人工在线客服
  • 医院网站建设的特点全媒体广告代理
  • 做网站版头蓝色图片搜索引擎优化排名培训
  • 怎么自己制作一个网站下载器谷歌google官方下载