15 Django REST Framework 给api添加自定义搜索条件
一、ListModelMixin源码
# 源码 class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
二、解决方法:
01-增加筛选条件 - 重写ListModelMixin的list方法
注:不会改变原有的筛选条件的方式 :queryset = self.filter_queryset(self.queryset);
如果放弃原有的筛选条件的方式: queryset = self.queryset 都重新做筛选。
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.queryset)
...
# 增加筛选条件
...
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
示例:
class RoomReservationViewSet(viewsets.ModelViewSet):
"""
list:
返回列出所有 会议室预定 数据.
检索方式:
官网地址:https://github.com/miki725/django-url-filter
单条件检索:/api/?work_status=已完成&&work_type=维修
单字段多条件检索: /api/?work_status__in=已完成,新建
非字段检索: /api/?work_status__icontains!=待审批
外键字段检索:/api/?approval_team__name=审批组
时间检索: start_time__range
/api/office_room/?start_time__range=2019-04-11,2019-04-12
/api/office_room/?start_time__year=2019
/api/office_room/?start_time__gt=2019-04-11 create:
创建一条 会议室预定 数据. retrieve:
返回一个 会议室预定 实例. update:
更新一条 会议室预定 数据. partial_update:
更新 会议室预定 的部分字段. delete:
删除一条 会议室预定 数据.
"""
queryset = models.RoomReservation.objects.all().order_by('-riid')
pagination_class = StandardResultsSetPagination
serializer_class = RoomReservationSerializer
# 使用过滤器
filter_backends = (DjangoFilterBackend, filters.SearchFilter,) authentication_classes = ()
permission_classes = (AllowAny, )
# 定义需要使用过滤器的字段
filter_fields = ('riid', 'roomid', 'start_time', 'end_time', 'res_user', 'com_name', 'room_status', 'res_time') search_fields = ('riid', 'roomid', 'start_time', 'end_time', 'res_user', 'com_name', 'room_status', 'res_time') def list(self, request, *args, **kwargs):
from rest_framework import mixins
# queryset = mixins.ListModelMixin.list(request, *args, **kwargs).queryset
time_now = datetime.datetime.now()
room_obj = RoomReservation.objects.all()
# 更新 会议室状态
for i in room_obj:
if i.start_time < time_now < i.end_time:
i.room_status = '使用中'
i.save()
elif time_now > i.end_time:
i.room_status = '已结束'
i.save() room_num = request.GET.get('room_num')
start_time = request.GET.get('start_time')
end_time = request.GET.get('end_time')
room_id = request.GET.get('room_id')
room_status = request.GET.get('room_status')
# queryset = self.queryset
queryset = self.filter_queryset(self.queryset)
if room_id:
queryset = models.RoomReservation.objects.filter(roomid__room_num=room_id).order_by('-riid')
if room_status:
queryset = models.RoomReservation.objects.filter(room_status=room_status).order_by('-riid') room_num_obj = models.RoomNumber.objects.filter(room_num=room_num).first()
# lt 小于 gt 大于
if room_num_obj:
queryset = models.RoomReservation.objects.filter(roomid=room_num_obj).order_by('-riid')
if room_num_obj and start_time and end_time:
queryset = models.RoomReservation.objects.filter(roomid=room_num_obj).filter(start_time__lt=end_time).filter(end_time__gt=start_time).order_by('-riid') page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data) def perform_create(self, serializer):
instance = serializer.save()
instance.res_time = datetime.datetime.now()
instance.save()
views.py
02-重写filter_queryset方法
注意:此处 worksheet_no 字段 为 外键字段;
def filter_queryset(self, queryset):
queryset = super(TasksViewSet, self).filter_queryset(self.queryset)
worksheet_no = self.request.query_params.get('worksheet_no', None)
print('worksheet_no', worksheet_no)
if worksheet_no:
worksheet_no_instance = WorkSheet.objects.filter(work_no=worksheet_no).first()
print('worksheet_no_instance', worksheet_no_instance)
queryset = self.queryset.filter(worksheet_no=worksheet_no_instance) return queryset
15 Django REST Framework 给api添加自定义搜索条件的更多相关文章
- Django Rest FrameWork 全部API
Django Rest FrameWork .Requests 请求 客服端发送给服务器的请求 .Responses 响应 rest框架支持响应不同格式的内容 .Views 视图 base基础类视图 ...
- Django REST framework 之 API认证
RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...
- 快用Django REST framework写写API吧
Django默认是前后端绑定的,提供了Template和Form,现在流行前后端分离项目,Python大佬坐不住了,于是便有了Django REST framework:https://github. ...
- Django REST framework 数据处理api
一.url分发 以防有其他业务线的需要,导致url杂乱,将每个app用到的url都设置在自己的应用中. # 项目下的url url(r"^api/(?P<version>\w+) ...
- Django Rest Framework API指南
Django Rest Framework API指南 Django Rest Framework 所有API如下: Request 请求 Response 响应 View 视图 Generic vi ...
- 用Django Rest Framework和AngularJS开始你的项目
Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...
- Getting Started with Django Rest Framework and AngularJS
转载自:http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html A ReST ...
- 利用 Django REST framework 编写 RESTful API
利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...
- Django Rest Framework 教程及API向导
Django Rest Framework 教程及API向导. 一.请求(Request)REST_FRAMEWORK 中的 Request 扩展了标准的HttpRequest,为 REST_FRAM ...
随机推荐
- .Net MVC+NPOI实现下载自定义的Word文档
我们浏览很多网站时都会看到下载文件的功能(图片.word文档等),好巧不巧的是贫道近日也遇到了这个问题,于是写一篇博客记录一下. 技术点:MVC.NPOI.Form表单. 具体如何实现,待贫道喝一口水 ...
- 【重学计算机】机组D6章:中央处理器
1. CPU的组成与功能 2. 数据通路 概念:执行部件间传送信息的路径,分共享通路(总线)和专用通路 抽象模型:时钟驱动下,A --> 组合逻辑 --> B D触发器定时模型: 时钟触发 ...
- [区块链] 带你进入Bitcoin开发 - 环境搭建
学习完区块链枯燥乏味的.高深的.必备的基础知识后,终于可以走上开发之路了!真是迫不及待啦!之后博客更新主要放在区块链的开发上,相信这才是大多数同学更加感兴趣的地方!学习过程从最经典的区块链鼻祖-比特币 ...
- ToastCustomUtil【简单的Toast封装类】【自定义Toast的显示风格】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 ToastUtil + ToastCustom结合.主要解决低版本机型上系统toast显示不好看的问题. 效果图 代码分析 在Toa ...
- .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个 ...
- matlab常用目录操作
总结matlab下常用到的目录操作 添加当前文件夹及其子文件夹至搜索路径 % add path rootDir = fileparts(mfilename('fullpath')); addpath( ...
- c#中缓存的使用
缓存的使用: 缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问,提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容 ...
- Spring-注解实现IOC
一.定义 注解:是一种标记式的配置方式,与XML配置文件不同,注解提供了更大的便捷性,易于维护修改,但是耦合度高. 本质:是一个继承了 Annotation 接口的接口,注解本身并没有什么作用,通过特 ...
- oracle学习笔记(三) DCL 数据控制语言与 DDL 数据定义语言
DCL 数据控制语言 Data control language 之前说过的授权和收权利语句 grant, revoke DDL 数据定义语言 Data define language create ...
- vue框架入门和ES6介绍
vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...