一、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添加自定义搜索条件的更多相关文章

  1. Django Rest FrameWork 全部API

    Django Rest FrameWork .Requests 请求 客服端发送给服务器的请求 .Responses 响应 rest框架支持响应不同格式的内容 .Views 视图 base基础类视图 ...

  2. Django REST framework 之 API认证

    RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...

  3. 快用Django REST framework写写API吧

    Django默认是前后端绑定的,提供了Template和Form,现在流行前后端分离项目,Python大佬坐不住了,于是便有了Django REST framework:https://github. ...

  4. Django REST framework 数据处理api

    一.url分发 以防有其他业务线的需要,导致url杂乱,将每个app用到的url都设置在自己的应用中. # 项目下的url url(r"^api/(?P<version>\w+) ...

  5. Django Rest Framework API指南

    Django Rest Framework API指南 Django Rest Framework 所有API如下: Request 请求 Response 响应 View 视图 Generic vi ...

  6. 用Django Rest Framework和AngularJS开始你的项目

    Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...

  7. Getting Started with Django Rest Framework and AngularJS

    转载自:http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html A ReST ...

  8. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

  9. Django Rest Framework 教程及API向导

    Django Rest Framework 教程及API向导. 一.请求(Request)REST_FRAMEWORK 中的 Request 扩展了标准的HttpRequest,为 REST_FRAM ...

随机推荐

  1. 《深入理解Java虚拟机》-----第7章 虚拟机类加载机制——Java高级开发必须懂的

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 7.1 概述 上一章我们了解了Class文件存储格式的具体细节,在Class文件中描述的各种信息,最终都需要 ...

  2. 《IDEO,设计改变一切》(Change By Design)- 读书笔记

    一.关于IDEO与设计思维 IDEO是一家世界顶级创意公司,而作者蒂姆布朗是IDEO的CEO.当然,在未阅读本书之前,我都是不知道的,也不会主动去了解IDEO和蒂姆布朗的.那么,我为什么要去读这样一本 ...

  3. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. SpringBoot是怎么在实例化时候将bean加载进入容器中

    之前写过的很多spring文章,都是基于应用方面的,这次的话,就带大家来一次对spring的源码追踪,看一看spring到底是怎么进行的初始化,如何创建的bean,相信很多刚刚接触spring的朋友, ...

  5. 研究windows下SVN备份及还原恢复方案

    windows下SVN备份方案 备份策略 svn备份一般采用三种方式: 1)svnadmin dump  2)svnadmin hotcopy  3)svnsync.  注意,svn备份不宜采用普通的 ...

  6. Asp.Net Core 轻松学-利用文件监视进行快速测试开发

    前言     在进行 Asp.Net Core 应用程序开发过程中,通常的做法是先把业务代码开发完成,然后建立单元测试,最后进入本地系统集成测试:在这个过程中,程序员的大部分时间几乎都花费在开发.运行 ...

  7. Unity MMORPG游戏开发教程(一)——初识Unity

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以C#为介绍语言,基于Unity2017.4.x. 一.环境搭建 我使用的是Unity+VSCode,用的是mac系统,windows的自己 ...

  8. Flutter 即学即用系列博客——06 超实用 Widget 集锦

    本篇文章我们来讲讲一些比较常用的 Widget. 大家验证的时候使用下面的代码替换 main.dart 代码,然后在 //TODO 语句返回下面常用 Widget 示例的代码. import 'pac ...

  9. 杭电ACM2018--母牛的故事

    母牛的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. JFreeChart画图+jsp页面显示实现统计图

    1 开发环境: 1.eclipse(可替换) 2.jfreechart-1.0.19 2 说明: (1) source目录:为 jfreechart的源码目录:不会的主要看这里.因为他的文档是收费的. ...