Django框架之模型层(建表传表连接访问数据库返回数据至前端页面)
Posted Icy Hunter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架之模型层(建表传表连接访问数据库返回数据至前端页面)相关的知识,希望对你有一定的参考价值。
文章目录
前言
django的一些基础操作操作应该到此也差不多了,模型层就是和数据库打交道的一层,也是比较关键的一层,也是遇到bug的一层,因为数据库版本和django版本不匹配会导致连接不上,那么就失去django的精华了,没有后端的操作,那就是在耍流氓了。好在,CSDN上教程很多,我成功重装数据库然后就连上了。
本文是接着Django框架之URL反向解析、静态文件配置以及应用的创建继续讲的,因此有些基本的配置就不再过多赘述。
Django的模型层
Django是使用了ORM框架
ORM即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
作用:
- 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库
- 根据设计的模型类生产数据库中的表格。
- 通过简单的配置就可以进行数据库的切换。
优点:
只需要面向对象编程,不需要面向数据库编写代码。
实现了数据模型与数据库的解耦,屏蔽了不同数据库操作的差异
缺点:
对于业务复杂,使用成本较高。
根据对象的操作转换成SQL语句,根据查询的结果转换成对象,在映射过程中有性能损失。
Django模型层的配置
首先需要安装mysqlclient>=1.3.13
pip install mysqlclient
如果安装不了说明以下两个没安装,需要安装以下
python3-dev
libmysqlclient-dev
具体怎么装还是CSDN吧,我自己电脑以前装过但是忘记了。
然后
打开终端进入数据库创建数据库或者打开navicat等操作也行
Create database 数据库名 default charset utf8
通常数据库名和项目名保持一致
Create database mysite1 default charset utf8;
创建完数据库之后
需要在项目Setting.py中进行数据库配置
修改DATABASES配置项的内容,由sqlite3变为mysql
setting.py原本是:
DATABASES =
'default':
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
配置mysql需要修改为:
DATABASES =
'default':
'ENGINE': 'django.db.backends.mysql',
'NAME': "mysite1", # 数据库名
"USER": "root", # 用户
"PASSWORD": "root", # 密码
"HOST": "127.0.0.1", # ip
"PORT": "3306" # 端口号
其中数据库名用户密码等等需要根据自己电脑的配置进行修改,以上是我自己电脑的配置。
在模型层中的规则为:
From Django.db import models
Class 模型类名(models.Model):
字段名 = models.字段类型(字段选项)
还需要迁移同步 makemigrations + migrate:
迁移时Django同步对模型所作的更改(添加字段,删除模型等)到数据库模式的方式
生成迁移文件 执行python manage.py makemigrations将应用下的models.py文件生成一个中间文件,并保存在migrations文件中
执行迁移脚本程序 python manage.py migrate执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步回数据库。
配置完之后,下面举个小例子看看是否能连接到数据库:
首先mysite1下的应用sports中的模板层models.py代码如下:
from django.db import models
# Create your models here.
class animal(models.Model):
name = models.CharField("名称", max_length=50, default="")
age = models.DecimalField("毛长", max_digits=7, decimal_places=2)
即按照上面的定义规则,定义一个名为sports_animal的数据表,并且其中有id(默认自动生成的主键),name,age三个字段
然后命令行(mysite1下)输入:
python manage.py makemigrations
生成迁移文件
然后执行迁移脚本程序,将表传给数据库在数据库生成对应的表结构,这里就是证明你是否连接成功数据库的关键一步。
命令行执行:
python manage.py migrate
如果出现以下:
恭喜你!连接成功了!
如果不是,可能就是前面配置哪里有点问题,如果确定前面配置的没问题,那么大概率可能因为版本不匹配导致数据库连接不上,因为django不支持3.+的不支持mysql数据库5.6以下的版本了。
那么请移步:卸载重装最新版mysql数据库亲测有效
还有一种办法就是django降级,但是没必要吧,更新换代还是不错的吧。
连接成功数据库之后,数据库中会建立好几个表,其中就包括我们刚定义的表,如下:
我用navicat打开可以看到表已经被创建出来了。
表迁移到了数据库。
我们自己定义的表是sports_animals,其他表是django自带的。
然后Django中还定义了许多其他的数据类型对应数据库的不同类型:
BooleanFiled()布尔型
CharField() varchar必须指定max_length
DataField()日期类型
DateTimeField表示时间和日期
DecimalField() decimal(x,y)max_digits, decimal_places
EmailFiled() varchar
ImageFiled() varchar 保存图片路径
TextField() longtext
具体可参考官方文档
字段类型文档
https://docs.djangoproject.com/en/4.0/ref/models/fields/#field-types
字段选项文档
https://docs.djangoproject.com/en/4.0/ref/models/fields/#field-opions
class animals(models.Model):
name = models.CharField('名称', max_length=50, default="")
age = models.DecimalField('毛长', max_digits=7, decimal_places=2, default=0)
# 添加一个新的字段
info = models.CharField('描述', max_length=100, default="")
class Meta:
db_table = 'Ani'
class Meta:
db_table = 'Ani'
//这个的作用就是能够让数据库的名称改变为自定义的“ani”
然后可以重新python manage.py makemigrations + python manage.py makemigrations
更新数据库里的表
创建数据
创建数据
增删改查CRUD
Django使用的是管理器对象
创建数据,有两种方案:
方案一:
MyModel.objects.create(属性1=值1, …)
成功:返回创建好的实体对象
失败:抛出异常
方案二:
Obj = MyModel(属性=值,…)
Obj.属性=值
Obj.save()
python manage.py shell
进入Django提供的shell能够轻松操作。
进入之后便可按上述两个方案进行数据创建
方案一
from sports.models import animals
a1 = animals.objects.create(name="AA", age="20", info="BBCC")
没报错就是插入成功。
我们可以打开navicat看看
确实插入成功
也可打开cmd命令行
Mysql -uroot -p
然后输入密码
然后找到数据库
Use mysite1(数据库名)
然后查里面的表
Select * from ani
可以发现:
确实插入了我们刚刚操作的数据。
方案二
使用第二种方式插入数据
查看数据表
同样成功插入。
查询数据
同样在Django提供的shell中:
ani = animals.objects.all() # 查询所有的数据
for a in ani:
print(a.name)
还可以简便的打印所有数据,重写__str__即可
models.py:
from django.db import models
# Create your models here.
class animals(models.Model):
name = models.CharField('名称', max_length=50, default="")
age = models.DecimalField('毛长', max_digits=7, decimal_places=2, default=0)
info = models.CharField('描述', max_length=100, default="")
class Meta:
db_table = 'Ani'
def __str__(self):
return '%s_%s_%s' % (self.name, self.age, self.info)
一些操作稍微记录下:
对象.object.value()返回字典
对象.object.values_list()返回元组
对象.object.order_by(“-列”, 列)默认升序
对象.query查看sql语句
例子
现在既然能够连接到数据库,那么可以做一个后端数据传输到前端的小例子。
sports下的models.py:
from django.db import models
# Create your models here.
class animals(models.Model):
name = models.CharField('名称', max_length=50, default="")
age = models.DecimalField('毛长', max_digits=7, decimal_places=2, default=0)
info = models.CharField('描述', max_length=100, default="")
class Meta:
db_table = 'Ani'
def __str__(self):
return '%s_%s_%s' % (self.name, self.age, self.info)
sports下的views.py:
只需要将models里的导入即可调用数据库了。
from django.shortcuts import render
from django.http import HttpResponse
from .models import animals
def index(request):
all = animals.objects.all()
return render(request, 'sport_new.html', locals()) # 所有变量都以字典的形式传入页面
# Create your views here.
然后sports下的templates中的sports_new.html:
可以修改一下,加个表格:
<!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>Document</title>
</head>
<body>
hello world i am from app_sports
<table border="1">
<tr>
<th>name</th>
<th>age</th>
<th>info</th>
</tr>
% for a in all %
<tr>
<td>a.name</td>
<td>a.age</td>
<td>a.info</td>
</tr>
% endfor %
</table>
</body>
</html>
然后启动服务器
访问http://127.0.0.1:8000/sports/sport_index
至此,Django已经可以实现前端网页返回后端数据库的值了,基本已经可以做东西了。
当然还有数据库的改和删没有讲,应该都差不太多了,后面可能就会讲的笼统一点了。
以上是关于Django框架之模型层(建表传表连接访问数据库返回数据至前端页面)的主要内容,如果未能解决你的问题,请参考以下文章