• 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
    
    • 1

    如果安装不了说明以下两个没安装,需要安装以下
    python3-dev
    libmysqlclient-dev
    具体怎么装还是CSDN吧,我自己电脑以前装过但是忘记了。

    然后
    打开终端进入数据库创建数据库或者打开navicat等操作也行
    Create database 数据库名 default charset utf8
    通常数据库名和项目名保持一致

    Create database mysite1 default charset utf8;
    
    • 1

    创建完数据库之后
    需要在项目Setting.py中进行数据库配置
    修改DATABASES配置项的内容,由sqlite3变为mysql

    setting.py原本是:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配置mysql需要修改为:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "mysite1", # 数据库名
            "USER": "root",  # 用户
            "PASSWORD": "root", # 密码
            "HOST": "127.0.0.1",  # ip 
            "PORT": "3306" # 端口号
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其中数据库名用户密码等等需要根据自己电脑的配置进行修改,以上是我自己电脑的配置。

    在模型层中的规则为:
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    即按照上面的定义规则,定义一个名为sports_animal的数据表,并且其中有id(默认自动生成的主键),name,age三个字段

    然后命令行(mysite1下)输入:

    python manage.py makemigrations
    
    • 1

    生成迁移文件
    在这里插入图片描述
    然后执行迁移脚本程序,将表传给数据库在数据库生成对应的表结构,这里就是证明你是否连接成功数据库的关键一步。
    命令行执行:

    python manage.py migrate
    
    • 1

    如果出现以下:

    在这里插入图片描述
    恭喜你!连接成功了!

    如果不是,可能就是前面配置哪里有点问题,如果确定前面配置的没问题,那么大概率可能因为版本不匹配导致数据库连接不上,因为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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    class Meta:
        db_table = 'Ani'
        //这个的作用就是能够让数据库的名称改变为自定义的“ani”
    
    • 1
    • 2
    • 3

    然后可以重新python manage.py makemigrations + python manage.py makemigrations
    更新数据库里的表
    在这里插入图片描述

    创建数据

    创建数据
    增删改查CRUD
    Django使用的是管理器对象

    创建数据,有两种方案:

    方案一:
    MyModel.objects.create(属性1=值1, …)
    成功:返回创建好的实体对象
    失败:抛出异常

    方案二:
    Obj = MyModel(属性=值,…)
    Obj.属性=值
    Obj.save()

    python manage.py shell
    
    • 1

    进入Django提供的shell能够轻松操作。
    进入之后便可按上述两个方案进行数据创建

    方案一

    在这里插入图片描述

    from sports.models import animals
    a1 = animals.objects.create(name="AA", age="20", info="BBCC")
    
    • 1
    • 2

    没报错就是插入成功。
    我们可以打开navicat看看
    在这里插入图片描述
    确实插入成功
    也可打开cmd命令行

    Mysql -uroot -p
    
    • 1

    然后输入密码
    然后找到数据库

    Use mysite1(数据库名)
    
    • 1

    然后查里面的表

    Select * from ani
    
    • 1

    可以发现:
    在这里插入图片描述
    确实插入了我们刚刚操作的数据。

    方案二

    使用第二种方式插入数据
    在这里插入图片描述
    查看数据表
    在这里插入图片描述
    同样成功插入。

    查询数据

    在这里插入图片描述
    同样在Django提供的shell中:
    在这里插入图片描述

    ani = animals.objects.all() # 查询所有的数据
    for a in ani:
    	print(a.name)
    
    
    • 1
    • 2
    • 3
    • 4

    还可以简便的打印所有数据,重写__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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    一些操作稍微记录下:

    对象.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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    然后启动服务器
    访问http://127.0.0.1:8000/sports/sport_index
    在这里插入图片描述
    至此,Django已经可以实现前端网页返回后端数据库的值了,基本已经可以做东西了。
    当然还有数据库的改和删没有讲,应该都差不太多了,后面可能就会讲的笼统一点了。

  • 相关阅读:
    2.3 数据链路层(DLL)模块分析
    Docker使用数据卷自定义镜像Dockerfile
    micro-ROS中对消息的内存管理
    音视频开发进阶——YUV与RGB的采样与存储格式
    力扣 572. 另一棵树的子树
    AttributeError: ‘numpy.ndarray‘ object has no attribute ‘fill_betweenx‘
    2023美亚杯个人赛复盘(二)
    【愚公系列】2022年11月 uniapp专题-运行uniapp的多种方式
    【计算机网络Part 1】概述+物理层
    JSP page指令
  • 原文地址:https://blog.csdn.net/qq_52785473/article/details/125481647