filter

queryset 使用request.user相关的queryset

class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer def get_queryset(self):
"""
返回purchaser 是request.user的queryset
"""
user = self.request.user
return Purchase.objects.filter(purchaser=user)

对queryset 做简单的filter 操作

import django_filters.rest_framework
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
# filter 操作依赖于filter_backends,所以需要先指定backends
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
# 指定filter 的字段
filter_fields = ('category', 'in_stock')

自定义filter

需要依赖第三方库django-filter

  • 安装: pip install django-filter
  • settings.py中 添加INSTALLED_APPS = [...,'django_filters',...]
  • 创建filters.py 文件 代码如下
import django_filters

from .models import Goods

class GoodsFilter(django_filters.rest_framework.FilterSet):
min_price = django_filters.NumberFilter(name='shop_price', lookup_expr='gt')
type = filters.CharFilter(method='filter_type') # 指定对应的方法 def filter_type(self, queryset, name, value):
#多选项,由,号分割
return queryset.filter(feature__in=value.split(",")) class Meta:
model = Goods
fields = ['min_price', ‘type’, 'status']
  • views.py文件中加入filter_class

from .filters import GoodsFilter class xxView(xxxView):
filter_class = GoodsFilter

search

我们用drf自带的SearchFilter可以实现该功能

from rest_framework import filters

class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
# backends 中加入SearchFilter 才能激活搜索,字段为 search
filter_backends = (filters.SearchFilter,)
search_fields = ('username', 'email',‘profile__profession’)

Ordering

同search一样,需要drf自带的OrderingFilter。使用方法如下

class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
# backend 中加入OrderingFilter 激活ordering filter,字段为ordering
filter_backends = (filters.OrderingFilter,)
ordering_fields = ('account', 'username', 'email')
# 指定默认的排序字段
ordering = ('username',)

如果需要取倒序,可以在字段前加“-” 如 http://example.com/api/users?ordering=-username, 如果需要多个排序的,可以使用“,”分隔 如:http://example.com/api/users?ordering=account,username

最新文章

  1. 用collectionview实现瀑布流-转(后面附demo,供参考)
  2. 获取WOED和EXCEL的公用方法
  3. svn记录删除
  4. poj 1654 Area (多边形求面积)
  5. poj 1190 生日蛋糕
  6. 黄聪:WordPress 的 Hook 机制与原理(add_action、add_filter)
  7. 制作Windows的ico图标
  8. BootStrap入门教程 (四) :JQuery类库插件(模态窗口,滚动监控,标签效果,提示效果,“泡芙”效果,警告区域,折叠效果,旋转木马,输入提示)
  9. Configuring Robolectric
  10. textarea 输入框限制字数
  11. 【夯实基础】Spring在ssh中的作用
  12. 局域网内一台电脑的ip地址自己会变,怎样让它不变
  13. weblogic10.3 启动报错 Unrecognized option: -jrockit Error: Could not create the Java Virtual Machine
  14. 从服务器角度分析RPG游戏——NPC的AI
  15. 序号生成算法odoo
  16. 2017年蓝桥杯省赛A组c++第5题(递归算法填空)
  17. 加载properties文件的三种方法
  18. (转)SpringBoot之退出服务(exit)时调用自定义的销毁方法
  19. zookeeper for windows
  20. nginx高性能WEB服务器系列之七--nginx反向代理

热门文章

  1. 06.FileStream类的学习
  2. 2.C#编程语言
  3. !function()是干什么的?
  4. 2729:Blah数集
  5. Web前端面试指导(七):入职后的建议
  6. Android仿QQ界面
  7. asp.net学习视频大全(共800集)
  8. 【嵌入式】安装Linux系统到开发板
  9. js 常用排序整理
  10. SVNKit学习——svn二次开发背景和闲谈(一)