一、关于Django架构的简述
Django使用的是MTV模式
MTV代表Model-Template-View(模型-模版-视图)模式
- M 模型层(Model)负责与数据库交互
- T 模版层(Template)负责呈现内容到浏览器
- V 视图层(View)负责接收请求,获取数据,返回结果
这种设计对后端开发人员是有好的,不用书写大量的SQL语句,简化操作,为深入了解其设计模式,推荐下面博主的文章
6.Django设计模式及模版层_Suyuoa的博客-CSDN博客_django设计模式目录1Django设计模式1.1MVC模式1.2MTV模式2模版层2.1模版配置2.2加载模版2.2.1方案一 loader2.2.2方案二 直接render2.3用字典传递信息2.4模版标签2.4.1if标签2.4.2for标签2.5模版过滤器2.5.1字符串全部变为小写 lower2.5.2字符串全变为大写 upper2.5.3改变数值 add:'n'2.5.4不让字符......https://blog.csdn.net/potato123232/article/details/122804729?ops_request_misc=&request_id=&biz_id=102&utm_term=Django%E6%A8%A1%E5%BC%8F&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-122804729.142%5Ev62%5Epc_search_tree,201%5Ev3%5Eadd_ask,213%5Ev1%5Et3_control1&spm=1018.2226.3001.4187二、对于开发环境的选择
2.1前端:根据业务需求,我选择的是Vue+LayUI,可能还会用到Bootstrap,Vue刚接触一段时间,但是前段时间集中在做app(使用的flutter)前端的时候对于组件有了更新的理解,这也是前端工程化的一个重要思想。
2.2后端:对于Java Web的开发我是陌生的,因为之前JDBC连个数据库就搞了好久,所以选择了Django,他的库、包是丰富的,借助之前用C++ MFC做系统的经验搭建环境也是轻松的,虽然一开始无从下手。
2.3数据库:选择的Mysql8.0,得益于SQL server学习的界面操作,为降低代码量、时间花费以及防止输入错误造成的返工,使用Navicat界面性进行傻瓜式操作。
三、需求简述
由于业务信息和项目需求可能不方便透露,所以简述一下:系统使用人员先进行模板表间运算与映射规则设计,前端获取经后端处理将其以SQL语句存储起来,以便在以后对于相同的业务表直接使用正则表达式替换使用。
3.1 settings文件配置
TEMPLATES = [ #模板路径
{
...
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
...
}
]
STATIC_URL = '/static/' #配置静态文件,以便上线
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'),)
3.2前端配置
{% load static %}<!--load声明-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>模块1</title>
<link href="{% static 'main.css' %}" rel="stylesheet"/><!--引用方式-->
</head>
<body>
<div class="temselectcenter">
<tr>
<td>{{ data }}</td><!--后端数据封装形式-->
<td></td>
</tr>
</div>
</body>
</html>
还有一些其他的语法形式
Django之模板语法_BANANAML的博客-CSDN博客模板的定义html里面有模板语法就不是html文件了,这样的文件叫做模板,用于分离文档的表现形式和内容。模板语法分类变量django模板变量的语法为{{ }}如:{{ name }}{{ d.name }} 字典可以根据句点符取值,其中d是一个字典。标签django模板变量的语法为{% tag %}标签比变量复杂:1)一些在输出中创建文本;2)一些通过循环或逻辑来控制流程...https://blog.csdn.net/BANANAML/article/details/102411070?ops_request_misc=&request_id=&biz_id=102&utm_term=%7B%7B%7D%7Ddjango%E8%AF%AD%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-102411070.142%5Ev62%5Epc_search_tree,201%5Ev3%5Eadd_ask,213%5Ev1%5Et3_control1&spm=1018.2226.3001.41873.3对于models的理解
对于模型层,真的真的是太友好了,解决了开发过程中80%的SQL语句,我觉得对于刚刚接触开发的盆友是容易上手的,仔细观察以下代码段
#models.py
class temproject(models.Model):#测试数据库连接的表
proid = models.IntegerField
proname = models.CharField(max_length=255)
proother = models.CharField(max_length=255)
prostyle = models.IntegerField
class Meta:
db_table="temproject"
#sql建表
CREATE TABLE `NewTable` (
`proid` int NOT NULL ,
`proname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`proother` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`prostyle` int NULL DEFAULT NULL ,
PRIMARY KEY (`proid`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;
?不难发现,其关系是一一对应的。
3.4对于刚才需求解决的思考
我们需要将表间计算方法由操作人员设计并以sql语句保存,显然这样直接使用Django的方法和函数是不现实的(可能有更好的解决办法),下面是采用静态语句进行测试,连接是可以正常查询的
from django.db import connection
from tem.models import formtable
from django.shortcuts import render
# Create your views here.
def index(request):
cursor = connection.cursor()
cursor.execute("select sum(prostyle) from temproject;")
p = cursor.fetchall()
data = p[0][0]
# context = {"stulist":list}
return render(request,"temselect.html",locals())
下面是一位博主介绍的有关函数的使用
【Python】数据库 fetchone()和fetchall()的使用_只要思想不滑坡办法总比困难多--小鱼干的博客-CSDN博客_fetchone一:fetchone() : 返回单个的元组,也就是一条记录(row),如果没有结果 , 则返回 None cu.execute("select user,password from user where user='%s'" %name) arr= cur.fetchone() ----此时 通过 arr[0],arr[1]可以依次访问user,password二:fetchall() : 返回多个元组,即返回多条记录(rows),如果没有结果,则返回 ().https://blog.csdn.net/weixin_45177786/article/details/120851459以及原生sql的执行
django使用原生SQL查询示例_淘小欣的博客-CSDN博客_django sqldjango使用原生SQL查询示例实际开发中,在ORM模型查询API不够用或或者数据量比较大的情况下,我们只能使用原始的SQL语句进行查询。文章目录django使用原生SQL查询示例1.raw()方法利用RAW方法执行原生的SQL语句RAW()查询可以查询其他表的数据RAW()方法自动将查询字段映射到模型字段原生SQL使用参数2.使用extra方法:3.直接执行原生SQL补充:1.raw()方法raw()管理器方法用于原始的SQL查询,并返回模型的实例。需要注意的是:raw()语法查询必须包含主键https://blog.csdn.net/weixin_44621343/article/details/120318905?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166723319116782428663339%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166723319116782428663339&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-5-120318905-null-null.142%5Ev62%5Epc_search_tree,201%5Ev3%5Eadd_ask,213%5Ev1%5Et3_control1&utm_term=django%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%94%9Fsql&spm=1018.2226.3001.4187下面变个小魔术
from django.http import HttpResponse
from tem.models import sqltest
from tem.models import formtable
from django.shortcuts import render
from django.db import connection
# Create your views here.
def index(request):
list = sqltest.objects.get(id=1)#django方法
sql1 = list.sqlsentence
cursor = connection.cursor()#原生游标
cursor.execute(str(sql1))#注意转类型
p = cursor.fetchall()#二维数组
data = p[0][0]
return render(request,"temselect.html",locals())
要注意数据库里面sql语句的存储形式,不要加引号否则识别不了。
?最后可以获得数据96
?当然我们的表的数据肯定不是一条两条,对于其他前后端数据交互的形式以后再精进。
|