python工业互联网应用实战3—模型层构建
本章开始我们正式进入到实战项目开发过程,如何从需求分析获得的实体数据转到模型设计中来,变成Django项目中得模型层。当然,第一步还是在VS2019 IDE环境重创建一个工程项目,本文我们把工程名称命名为IndDemo,如下图:
VS2019创建的Django项目结构如下图
现在按F5调试程序,又来到Django熟悉的欢迎页面了。
接下来让开始这趟实战之旅吧!
1.1. 实体关系图
从上一章需求涉及到的实体,来构建我们的实体关系图吧,这里的步骤也相当于早期开发设计的表结构设计,只是如前面章节说的有了ORM机制后,我们讨论采用对象模型来设计和讨论实体可能更适合于实际的场景讨论,便于团队在同一个频道下沟通,当然这里实质上与表设计没有太多本质的区别,但是多对多等中间表在实体关系图中就看不到了,表结构设计时就不能忽略这个中间表的存在。产品经理更专注于需求而不是数据库存储结构是不是更符合专业分工?开发人员也不用大费周章来折腾表结构的优化了。嗯,这些可以丢给DBA来优化吧。
本图采用网址ponyorm网站在线绘制,网址:https://editor.ponyorm.com/.
1.2. Django model层
为了便于对照学习和理解,我们新增一个新的APP 命名为:Task来专门处理这个业务,不修改默认的APP里的代码,也便于过程中可以通过这个默认APP功能,参照它的结构和语法等。
现在我们的工程目录结构如下:
打开Task.models.py文件编写我们实体关系图的模型代码吧,作者本人比较习惯“大驼峰”命名法也就是首字母都大写的模式TaskNum,后面很多命名都会采用这个方式,不采用python主流的蛇形命名法的task_num方式,纯属个人习惯。我们依据设计我们开始构建我们的model代码如下:
from django.db import models from django.contrib.auth.models import User PRIORITY=((1,u"正常"),(2,u"急"),(3,u"紧急")) class Task(models.Model): TASK_STATE=((1,u"未处理"),(4,u"处理成功"),(5,u"执行中"),(99,u"完成"),(-1,u"已取消")) TaskId = models.AutoField(primary_key=True, db_column="task_id") TaskNum = models.IntegerField(u"任务号", null=False, db_column="task_num") Source = models.CharField(u"源地址", null=False, max_length=50, db_column="source") Target = models.CharField(u"目标地址", null=False, max_length=50, db_column="target") Barcode = models.CharField(u"容器条码", null=False, max_length=50, db_column="barcode") State = models.IntegerField(u"状态", choices=TASK_STATE, null=False, db_column="state") Priority = models.IntegerField(u"优先级", choices=PRIORITY, null=True, db_column="priority") BeginDate = models.DateTimeField(u"开始时间",null=True, db_column="begin_date") EndDate = models.DateTimeField(u"结束时间",null=True, db_column="end_date") SystemDate = models.DateTimeField(u"系统时间", null=False, auto_now_add=True, db_column="system_date") User = models.ForeignKey(User, verbose_name="操作员", on_delete=models.CASCADE,db_column="user_id") class Meta: db_table = "task_task" ordering = ["-Priority","TaskId"] verbose_name = verbose_name_plural = "任务" def __str__(self): return str(self.TaskNum) class Job(models.Model): JOB_STATE=((1,u"新作业"),(2,u"下达执行"), (99,u"完成"),(-1,u"已取消")) JobId = models.AutoField(primary_key=True, db_column="job_id") Task = models.ForeignKey("Task", verbose_name="任务", blank=True, on_delete=models.CASCADE) TaskNum = models.IntegerField(u"任务号", null=False, db_column="task_num") OrderNo = models.IntegerField(u"顺序号", null=False, db_column="order_no") Source = models.CharField(u"源地址", null=True, max_length=50, db_column="source") Target = models.CharField(u"目标地址", null=True, max_length=50, db_column="target") Executor = models.CharField(u"执行器", null=False,blank=True, max_length=50, db_column="executor") State = models.IntegerField(u"状态", choices=JOB_STATE, null=False, db_column="state") Priority = models.IntegerField(u"优先级", choices=PRIORITY, null=True, db_column="priority") BeginDate = models.DateTimeField(u"开始时间",null=True, db_column="begin_date") EndDate = models.DateTimeField(u"结束时间",null=True, db_column="end_date") SystemDate = models.DateTimeField(u"系统时间", null=False, auto_now_add=True, db_column="system_date") Barcode = models.CharField(u"条码", null=False, max_length=50, db_column="barcode") User = models.ForeignKey(User, verbose_name="操作员", on_delete=models.CASCADE,db_column="user_id") class Meta: db_table = "task_job" ordering = ["JobId"] verbose_name = verbose_name_plural = "作业" def __str__(self): return str(self.TaskNum) +"-"+str(self.OrderNo)