Django框架之模型层(建表传表连接访问数据库返回数据至前端页面)

Posted Icy Hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架之模型层(建表传表连接访问数据库返回数据至前端页面)相关的知识,希望对你有一定的参考价值。

文章目录

前言

django的一些基础操作操作应该到此也差不多了,模型层就是和数据库打交道的一层,也是比较关键的一层,也是遇到bug的一层,因为数据库版本和django版本不匹配会导致连接不上,那么就失去django的精华了,没有后端的操作,那就是在耍流氓了。好在,CSDN上教程很多,我成功重装数据库然后就连上了。
本文是接着Django框架之URL反向解析、静态文件配置以及应用的创建继续讲的,因此有些基本的配置就不再过多赘述。

Django的模型层

Django是使用了ORM框架

ORM即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
作用:

  1. 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库
  2. 根据设计的模型类生产数据库中的表格。
  3. 通过简单的配置就可以进行数据库的切换。

优点:
只需要面向对象编程,不需要面向数据库编写代码。
实现了数据模型与数据库的解耦,屏蔽了不同数据库操作的差异

缺点:
对于业务复杂,使用成本较高。
根据对象的操作转换成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框架之模型层(建表传表连接访问数据库返回数据至前端页面)的主要内容,如果未能解决你的问题,请参考以下文章

64django之模型层(model)--建表查询删除基础

Django之ORM

[置顶]Django框架

Django之ORM操作

Django框架

Django 框架入门