Django中使用MySQL的视图View

文章目录

  • 一、MySQL创建视图
  • 二、Django模型定义

一、MySQL创建视图

首先确定好自己需要链接的两张表及其对应的字段,视图的意义是将两张表数据联合一起变成一张新的表方便后续查询数据。

源Django两张表模型

	class ProjectTaskRange(BaseModel, TimeModel):class Meta:verbose_name = "任务安排"verbose_name_plural = "任务安排"project_case_id = models.ForeignKey(help_text="所属项目实例ID", verbose_name="所属项目实例ID", to='ProjectCase', to_field='id',db_column='project_case_id', on_delete=models.CASCADE, default=0, null=True)project_case_step_quote_id = models.ForeignKey(verbose_name="所属项目实施步骤ID", to='ProjectCaseStepQuote', help_text="所属项目实施步骤ID",to_field='id', db_column='project_case_step_quote_id', on_delete=models.CASCADE, default=0, null=True)project_task_range_name = models.CharField(help_text="任务安排名称", verbose_name="任务安排名称", default='',max_length=256)project_task_manager = models.ForeignKey(verbose_name="任务负责人ID", help_text="任务负责ID", related_name="tasks",to="User", to_field="id", db_column="project_task_manager",on_delete=models.PROTECT, null=True, blank=True, default=1)project_task_executor = models.ManyToManyField(User, default=None)executor_coefficient = models.FloatField(verbose_name="人员系数", help_text="人员系数", default=1)step_id = models.SmallIntegerField(verbose_name='区分step_Id', default=None, null=True)range_description = models.CharField(max_length=256, verbose_name='任务不合理描述', null=True, blank=True)overdue_choices = ((0, None),(1, "完成"),(2, "逾期未做任务"),(3, "逾期在做任务"))overdue = models.SmallIntegerField(verbose_name='逾期标识', choices=overdue_choices, null=True, blank=True,default=0)mount = models.SmallIntegerField(verbose_name='挂载引用步骤顺序', null=True, blank=True)check_time = models.DateTimeField(verbose_name='审核完成日期', null=True, default=None)       # 根据状态自动生成project_id = models.SmallIntegerField(verbose_name='标准工时大列id', null=True, default=None)# 任务审核人 查询引用步骤是否已有审核人, 有则添加, 无则添加任务责任人。range_auditor = models.CharField(verbose_name='任务审核人id', max_length=128, null=True, default=None)# 任务备注task_description = models.TextField(max_length=65335, verbose_name='任务描述', null=True, blank=True)# 0 待审核 1审核中 2审核完 3 不通过status_choices = {(0, "待审核"),(1, "审核中"),(2, "审核完成"),(3, "审核不通过"),}range_check_status = models.SmallIntegerField(verbose_name='任务审核状态', choices=status_choices, null=True, blank=True,default=0)execute_choices = {(0, "未执行"),(1, "执行中"),(2, "执行完成"),}range_execute_status = models.SmallIntegerField(verbose_name='任务审核状态', choices=execute_choices, null=True, blank=True,default=0)class TaskRangeFile(BaseModel):class Meta:verbose_name = "任务完成情况附件"verbose_name_plural = "任务完成情况附件"project_task_range_id = models.ForeignKey(verbose_name="所属的任务安排ID", to="ProjectTaskRange", to_field="id",related_name="files",db_column='project_task_range_id', on_delete=models.CASCADE, null=True)# 用户上传的文件file = models.FileField(verbose_name="文件", upload_to="task_range_files/", null=True)# 标准附件step_file = models.FileField(verbose_name='任务模板步骤附件', upload_to="task_quote_file/", null=True)step_description = models.FileField(verbose_name='任务模板步骤描述', max_length=128, null=True)step_id = models.SmallIntegerField(verbose_name='标准附件id', null=True, default=0)# 任务模版附件range_file = models.FileField(verbose_name='任务模版附件', upload_to='range_file', null=True)# 是否上传附件  标准工时通过到这true_or_false = models.BooleanField(verbose_name='是否必须上传标准附件', null=True, default=None)# 任务审核状态是否通过file_true_or_false = models.BooleanField(verbose_name='审核状态是否通过', null=True, default=None)parameter = models.CharField(max_length=256, verbose_name='参数', null=True, blank=True)# 参数描述parameter_description = models.CharField(max_length=256, verbose_name='附件描述', null=True, blank=True)# 参数是否必填parameter_true_or_false = models.BooleanField(verbose_name='参数是否必填', null=True, default=False)

以上是演示的两张表原型,View的新表字段是通过我们自己选择性创建的,我们需要哪些字段可以加入哪些字段。

SQL创建view(注意字段名称不要重复 以免报错)

	SELECT`app02_projecttaskrange`.`id` AS `range_id`,`app02_projecttaskrange`.`create_by` AS `range_create_by`,`app02_projecttaskrange`.`create_time` AS `range_create_time`,`app02_projecttaskrange`.`update_by` AS `range_update_by`,`app02_projecttaskrange`.`update_time` AS `range_update_time`,`app02_projecttaskrange`.`delete` AS `range_delete`,`app02_projecttaskrange`.`plan_start_time` AS `range_plan_start_time`,`app02_projecttaskrange`.`plan_stop_time` AS `range_plan_stop_time`,`app02_projecttaskrange`.`actual_start_time` AS `range_actual_start_time`,`app02_projecttaskrange`.`actual_stop_time` AS `range_actual_stop_time`,`app02_projecttaskrange`.`project_task_range_name` AS `range_project_task_range_name`,`app02_projecttaskrange`.`executor_coefficient` AS `range_executor_coefficient`,`app02_projecttaskrange`.`project_case_id` AS `range_project_case_id`,`app02_projecttaskrange`.`project_task_manager` AS `range_project_task_manager`,`app02_projecttaskrange`.`project_case_step_quote_id` AS `range_project_case_step_quote_id`,`app02_projecttaskrange`.`step_id` AS `range_step_id`,`app02_projecttaskrange`.`range_description` AS `range_description`,`app02_projecttaskrange`.`mount` AS `range_mount`,`app02_projecttaskrange`.`overdue` AS `range_overdue`,`app02_projecttaskrange`.`check_time` AS `range_check_time`,`app02_projecttaskrange`.`project_id` AS `range_project_id`,`app02_projecttaskrange`.`range_auditor` AS `range_auditor`,`app02_projecttaskrange`.`task_description` AS `range_task_description`,`app02_projecttaskrange`.`range_check_status` AS `range_check_status`,`app02_projecttaskrange`.`range_execute_status` AS `range_execute_status`,`app02_taskrangefile`.`id` AS `id`,`app02_taskrangefile`.`create_by` AS `file_create_by`,`app02_taskrangefile`.`create_time` AS `file_create_time`,`app02_taskrangefile`.`update_by` AS `file_update_by`,`app02_taskrangefile`.`update_time` AS `file_update_time`,`app02_taskrangefile`.`delete` AS `file_delete`,`app02_taskrangefile`.`file` AS `file`,`app02_taskrangefile`.`project_task_range_id` AS `file_project_task_range_id`,`app02_taskrangefile`.`step_description` AS `file_step_description`,`app02_taskrangefile`.`step_file` AS `file_step_file`,`app02_taskrangefile`.`step_id` AS `file_step_id`,`app02_taskrangefile`.`range_file` AS `file_range_file`,`app02_taskrangefile`.`true_or_false` AS `file_true_or_false`,`app02_taskrangefile`.`file_true_or_false` AS `file_file_true_or_false`,`app02_taskrangefile`.`parameter` AS `file_parameter`,`app02_taskrangefile`.`parameter_description` AS `file_parameter_description`,`app02_taskrangefile`.`parameter_true_or_false` AS `file_parameter_true_or_false` FROM(`app02_projecttaskrange`JOIN `app02_taskrangefile` ON ((`app02_projecttaskrange`.`id` = `app02_taskrangefile`.`project_task_range_id` ))) WHERE((`app02_projecttaskrange`.`delete` <> 1 ) AND ( `app02_taskrangefile`.`delete` <> 1 ))

Navicat创建视图
1. 选择好数据库,右键视图创建视图

在这里插入图片描述
2. 可以通过视图创建工具选择对应表及其对应的字段创建即可(底层也是SQL创建)

在这里插入图片描述

3.以上只是在MySQL中定义了view视图,但是Django中是没有这个view

二、Django模型定义

注意Django定义的模型名称需要跟上一步MySQL中的view名称一致,MySQL中view是什么Django对应即可

models.py

class RangeAndFIle(models.Model):range_id = models.SmallIntegerField()range_create_by = models.CharField(max_length=128)range_create_time = models.DateTimeField()range_update_by = models.CharField(max_length=128)range_update_time = models.DateTimeField()range_delete = models.BooleanField()range_plan_start_time = models.DateTimeField()range_plan_stop_time = models.DateTimeField()range_actual_start_time = models.DateTimeField()range_actual_stop_time = models.DateTimeField()range_project_task_range_name = models.CharField(max_length=128)range_executor_coefficient = models.FloatField()range_project_case_id = models.SmallIntegerField()range_project_task_manager = models.SmallIntegerField()range_project_case_step_quote_id = models.SmallIntegerField()range_step_id = models.SmallIntegerField()range_description = models.TextField(max_length=256)range_mount = models.SmallIntegerField()range_overdue = models.SmallIntegerField()range_check_time = models.DateTimeField()range_project_id = models.SmallIntegerField()range_auditor = models.CharField(max_length=32)range_task_description = models.TextField(max_length=65335)range_check_status = models.SmallIntegerField()range_execute_status = models.SmallIntegerField()id =  models.SmallIntegerField(primary_key=True)	# 注意唯一ID还是需要的file_create_by =  models.CharField(max_length=32)file_create_time = models.DateTimeField()file_update_by =  models.CharField(max_length=32)file_update_time = models.DateTimeField()file_delete = models.BooleanField()file = models.CharField(max_length=256)file_project_task_range_id = models.SmallIntegerField()file_step_description = models.CharField(max_length=256)file_step_file = models.CharField(max_length=256)file_step_id =  models.SmallIntegerField()file_range_file = models.CharField(max_length=256)file_true_or_false = models.BooleanField()file_file_true_or_false = models.BooleanField()file_parameter = models.CharField(max_length=256)file_parameter_description = models.CharField(max_length=256)file_parameter_true_or_false = models.BooleanField()class Meta:managed = False		# 默认是Ture 设成False django将不会执行建表和删表操作,但会生成迁移文件db_table = 'range_and_file'		# 注意对应MySQL中的名称

表字段及其对应关系写好之后执行命令

	python manage.py makemigrationspython manage.py migrate

这样视图就创建好了可以通过view是写对应的接口查询数据,注意view视图只能查看不能做修改增加删除功能

views.py

	class GetMergedTaskData(BaseViewSet):queryset = RangeAndFIle.objects.filter(range_delete=False).order_by('-range_create_time')serializer_class = RangeAndFIleSerializerfilter_backends = [MyFilterBackend,  RangeAndFIleBackend]filterset_class = RangeAndFIleFilterdef get_queryset(self):queryset = super().get_queryset()query_params = {key: value for key, value in self.request.query_params.items() if value != ''}project_task_executor = query_params.get('project_task_executor')range_auditor = query_params.get('range_auditor')range_project_task_manager = query_params.get('range_project_task_manager')if 'ordering' in query_params:if query_params['ordering'] == '-create_time':queryset = queryset.filter(range_delete=False).order_by('-range_create_time')else:queryset = queryset.filter(range_delete=False).order_by('range_create_time')if project_task_executor:result = ProjectTaskRange.objects.filter(project_task_executor=int(project_task_executor), delete=False).all()id_list = [ i.id for i in result]queryset = queryset.filter(range_id__in=id_list, range_delete=False).all()if 'file_file_true_or_false' in query_params:if self.request.query_params['file_file_true_or_false'] == 'none':queryset = queryset.filter(range_delete=False, file_file_true_or_false=None).order_by('range_create_time')elif self.request.query_params['file_file_true_or_false'] == 'true':queryset = queryset.filter(range_delete=False, file_file_true_or_false=True).order_by('range_create_time')else:queryset = queryset.filter(range_delete=False, file_file_true_or_false=False).order_by('range_create_time')filters = {}for field_name in ['range_check_time']:after = self.request.query_params.get(f'{field_name}_after')before = self.request.query_params.get(f'{field_name}_before')if after and before:filters[f'{field_name}__gte'] = beforefilters[f'{field_name}__lte'] = afterif range_project_task_manager and range_project_task_manager != '':filters['range_project_task_manager'] = range_project_task_managerif range_auditor and range_auditor != '':filters['range_auditor__contains'] = range_auditorif filters:queryset = queryset.filter(**filters)return queryset

以上是文章所有内容 希望帮助到你

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS-高德地图SDK接入-Swift

申请key 这个要前往高德开发平台注册成为个人开发者然后在控制台创建一个应用&#xff1a; 高德开发平台 注册步骤就不写了&#xff0c;写一下创建应用的步骤&#xff1a; 1、点击应用管理——>我的应用 2、点击右上角的创建新应用 3、输入内容&#xff1a; 4、点击添加ke…

新定义51单片机(RD8G37)实现测距测速仪

本文描述用新定义51单片机&#xff08;RD8G37&#xff09;超声波一体测距传感器实现简单的测距测速仪。 测距仪演示效果 新定义RD8G37Q48RJ开发板 超声波测距模块&#xff1a; 8位并口屏 1、main.c unsigned short timeConsuming0; unsigned int oldDistance;void rectClearS…

阿里云国外服务器价格表

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

web terminal - 如何在mac os上运行gotty

gotty可以让你使用web terminal的方式与环境进行交互&#xff0c;实现终端效果 假设你已经配置好了go环境&#xff0c;首先使用go get github.com/yudai/gotty命令获取可执行文件&#xff0c;默认会安装在$GOPATH/bin这个目录下&#xff0c;注意如果你的go版本比较高&#xff…

大数据深度学习ResNet深度残差网络详解:网络结构解读与PyTorch实现教程

文章目录 大数据深度学习ResNet深度残差网络详解&#xff1a;网络结构解读与PyTorch实现教程一、深度残差网络&#xff08;Deep Residual Networks&#xff09;简介深度学习与网络深度的挑战残差学习的提出为什么ResNet有效&#xff1f; 二、深度学习与梯度消失问题梯度消失问题…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

RaspberryPi(树莓派)配置 VNC

RaspberryPi&#xff08;树莓派&#xff09;是可以通过 VNC 来连接到机器上进行图形化操作的。 什么 VNC VNC&#xff08;Virtual Network Computing&#xff09;&#xff0c;为一种使用RFB协议的屏幕画面分享及远程操作软件。此软件借由网络&#xff0c;可发送键盘与鼠标的动…

node.js(express.js)+mysql实现注册功能

文章目录 实现步骤一、获取客户端提交到服务器的用户信息&#xff0c;对表单中的数据&#xff0c;进行合法性的效验 代码如下:二、检测用户名是否被占用三、对密码进行加密四、插入新用户&#xff08;完整代码&#xff09;总结 实现步骤 一、获取客户端提交到服务器的用户信息…

plc红绿灯程序

引言&#xff1a; PLC&#xff08;Programmable Logic Controller&#xff0c;可编程逻辑控制器&#xff09;是一种用于工业自动化控制的电子设备。西门子的SIMATIC S7-200是这类设备的一个流行系列&#xff0c;广泛应用于小型至中等规模的自动化项目中。它具有以下特点&#…

常见的设计模式(模板与方法,观察者模式,策略模式)

前言 随着时间的推移&#xff0c;软件代码越来越庞大&#xff0c;随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前&#xff0c;使用的是面向过程开发来设计大型的软件程序&#xff0c;面向过程开发将软件分成一个个单独的模块&#xff0c;模块之间使用函数…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

7.6 MySQL基本函数的使用(❤❤❤)

7.6 MySQL基本函数的使用 1. 提要2. 数字函数3. 字符函数3.1 替换字符3.2 左填充字符及截取字符串 4. 日期函数4.1 日期函数4.2 表达式占位符4.3 日期偏移计算4.4 日期间隔 5. 条件函数5.1 IF语句5.2 case...when语句 1. 提要 2. 数字函数 3. 字符函数 3.1 替换字符 -- INSERT…

[剪藏] - 任泽平年终演讲精华:点燃希望——2024中国经济十大预测

任泽平年终演讲精华&#xff1a;点燃希望——2024中国经济十大预测 泽平宏观 2023-12-23 08:01 发表于上海 12月22日22:30&#xff0c;任泽平年终秀“点燃希望乐观者前行——2024中国经济十大预测”圆满收官。 泽平宏观、北京广播电视台、上海高净值研究院、北京时间等携手打…

Gorm 应用开发时区问题与unique唯一索引字段数据冲突问题

文章目录 一、定义表模型时区问题1.1 time.Time 与int641.2 优势 二、unique唯一索引字段数据冲突问题 一、定义表模型时区问题 1.1 time.Time 与int64 一般情况下&#xff0c;我们在定义表模型的时候&#xff0c;会使用time.Time&#xff0c;但是会根据当前时间存储。返回给…

现代密码学 考点汇总(下)

现代密码学 考点汇总 写在最前面考试范围一、给一个简单的方案&#xff0c;判断是否cca安全二、随机预言机模型之下的简单应用 2. MAC概念回顾MAC的定义适应性CMA&#xff08;Chosen Message Attack&#xff09;PPT攻击者不可忽略的概率&#xff08;negl(n)&#xff09;总结 案…

three.js 点按钮,相机飞行靠近观察设备

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

vue2+webpack升级vue3+vite,报错Cannot read properties of null (reading ‘isCE‘)

同学们可以私信我加入学习群&#xff01; 正文开始 前言问题分析解决总结 前言 系列文章&#xff1a;vue2webpack升级vue3vite&#xff0c;修改插件兼容性bug 前面的文章主要是介绍&#xff0c;在升级初始阶段遇到的一些显而易见的兼容性问题和bug。随着项目迭代的不断深入&a…

视频美颜SDK技术解析与技术对比

当下&#xff0c;各类应用和服务纷纷采用视频美颜SDK&#xff0c;以提供更加令人满意的视觉效果。本文将深入探讨视频美颜SDK的技术原理&#xff0c;同时对比不同SDK的特性&#xff0c;为开发者和决策者提供全面的技术参考。 一、技术原理解析 1.图像处理基础 视频美颜SDK基…

易懂的方式讲解ARM中断原理以及中断嵌套方法

ARM有七种模式&#xff0c;我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚&#xff08;实际上是看不见的&#xff09;&#xff0c;一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中&#xff0c;有一个I位和一个F位&#xff0c;分别用来禁止IRQ和FIQ。 先…

MyBatisPlus学习笔记三-核心功能

接上篇&#xff1a; MyBatisPlus学习笔记二-CSDN博客 1、核心功能-IService开发基础业务接口 1.1、介绍 1.2、引用依赖 1.3、配置文件 1.4、用例-新增 1.5、用例-删除 1.6、用例-根据id查询 1.7、用例-根据ids查询 2、核心功能-IService开发复杂业务接口 2.1、实例-更新 3、…