【python】Django系列09-Django中的数据库与ORM

作者:爱编程的小贤
⛳知识点:Django–数据库与ORM
:每天学一点,早日成大佬

文章目录

  • ⏳ 前言
  • ⏳ 一、ORM框架
    • 1.ORM优点
    • 2.ORM作用
    • 3.ORM解析流程
    • 4.ORM对应关系表
  • ⏳ 二、模型类
    • 1.模型类介绍
    • 2.模型类字段类型
    • 3.模型类字段参数
    • 4.模型类定义
    • 5.数据库迁移和同步
  • ⏳ 三、shell工具
  • ⏳ 总结

⏳ 前言

今天我们进入Django数据库与ORM的学习啦!!! 学习之前先要好好复习回顾前面的内容哦!!!
如果你看完感觉对你有帮助,,,欢迎给个三连哦!!!您的支持是我创作的动力。 感谢感谢!!!

⏳ 一、ORM框架

ORM,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作为实例,把字段作为属性,ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
【python】Django系列09-Django中的数据库与ORM_第1张图片

1.ORM优点

  1. 易用性:使用ORM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰。
  2. 高效性(性能损耗小):ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处是远远大于性能损耗,而且项目越大作用越明显。
  3. 灵活性(设计灵活):可以轻松的写出复杂的查询。
  4. 可移植性:Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL、PostgreSQL和SQLite
  5. 兼容性: 可以轻松的更换数据库进行数据迁移,保证了各种数据库更换迁移之后的兼容性

2.ORM作用

用于实现面向对象编程语言里不同类型的数据之间的转换。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
不需要直接面向数据库编程而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

【python】Django系列09-Django中的数据库与ORM_第2张图片

3.ORM解析流程

1. ORM会将Python代码转成为SQL语句。
2. SQL语句通过pymysql传送到数据库服务端。
3. 在数据库中执行SQL语句并将结果返回。

4.ORM对应关系表

【python】Django系列09-Django中的数据库与ORM_第3张图片

⏳ 二、模型类

1.模型类介绍

如果我们使用ORM来映射对应关系,就需要先设计出一个模型类,这个模型类实际上是一个业务的集合,我们需要把各种属性抽象出来,然后通过一些对应的字段参数去实现

例如:我们想设计一个游戏英雄的模型类,那么首先需要抽象出一个英雄类,同时也要设计出英雄的属性信息。
一个英雄模型类的字段信息:英雄名称、英雄价格、使用次数、胜利次数、发布日期等。
一个英雄模型类的元属性:类所映射的数据库表名、英雄模型类的别名。
一个英雄模型类的返回信息:英雄模型类实例的返回信息,一般返回名称,例如返回英雄名称。

使用django进行数据库开发的步骤如下:

配置数据库连接信息 
在models.py中定义模型类 
迁移
通过类和对象完成数据增删改查操作

2.模型类字段类型

类型 说明

【python】Django系列09-Django中的数据库与ORM_第4张图片

3.模型类字段参数

【python】Django系列09-Django中的数据库与ORM_第5张图片
外键设置
在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

CASCADE级联,删除主表数据时连带一起删除外键表中数据
PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
SET()设置为特定值或者调用特定方法
DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常

django在使用外键ForeignKey的时候,会自动给当前字段后面添加一个后缀_id。
正常来说这样并不会影响使用。除非你要写原生sql,还有就是这个表是已经存在的,你只是把数据库中的表映射回models。实际上django提供了这样的一个关键字db_colnum来解决这个问题,你只需要:

f = models.ForeignKey(AnotherModel, db_column='f') # ‘f’ 是外键的名字

这样就不会自动添加_id这个后缀了。

模型类总结

1. 一个模型类对应一张数据库表(默认情况下会有一个自增的字段id,主键)
2. 模型类中一个属性对应数据库表中的一个字段
3. Meta中,db_table对应的是数据库表的表名,也就是说可以通过修改它的值来修改数据库表名

4.模型类定义

  • 模型类被定义在 “应用models.py”文件中。
  • 模型类必须继承自Model类,位于包django.db.models中。

Models代码

from django.db import models


# 定义英雄信息的模型类
class hero_info(models.Model):
    # 类的属性(表的字段)
    hero_name = models.CharField(max_length=10, verbose_name='英雄名称')
    hero_price = models.FloatField(verbose_name='英雄价格')
    usage_count = models.IntegerField(verbose_name='使用次数')
    victory_count = models.IntegerField(verbose_name='胜利次数')
    week_free = models.BooleanField(verbose_name='是否周免', default=False)
    release_data = models.DateField(verbose_name='发布日期', auto_now_add=True)
    hero_image = models.ImageField(upload_to='hero', verbose_name='英雄图片', null=True)

    # 元属性
    class Meta:
        db_table = 'hero_info'  # 指定数据库中表的名称(不能是中文),没有指定则以模型类名作为表名
        verbose_name = '英雄信息'  # 指定表的别名,一般用于起中文名称
        verbose_name_plural = verbose_name  # 指定复数形式也为中文别名

    # 返回信息
    def __str__(self):
        return self.hero_name  # 一般返回名称,用来指代查到的这条数据

 

# 定义英雄技能的模型类
class hero_skill(models.Model):
    # 类的属性(表的字段)
    skill_name = models.CharField(max_length=10, verbose_name='技能名称')
    reset_time = models.FloatField(verbose_name='冷却时间')
    skill_duration = models.FloatField(verbose_name='持续时间')
    magic_deplete = models.IntegerField(verbose_name='魔法消耗')

    # 设置外键属性
    hero_info = models.ForeignKey(hero_info, on_delete=models.CASCADE,
                                  db_column='hero_info', verbose_name='所属英雄')

    # 数据库创建表的时候会自动在属性名称后面加_id,即hero_info_id,为了保持原有的名字就使用db_column

    # 元属性
    class Meta:
        db_table = 'hero_skill'  # 指定数据库中表的名称(不能是中文),没有指定则以模型类名作为表名
        verbose_name = '技能信息'  # 指定表的别名,一般用于起中文名称
        verbose_name_plural = verbose_name  # 指定复数形式也为中文别名

    # 返回信息
    def __str__(self):
        return self.skill_name  # 一般返回名称,用来指代查到的这条数据

    # 返回关联主表中的英雄发布时间字段
    def hero_release_date(self):
        # self.外键.主表字段
        return self.hero_info.release_data

    # 方法名.short_description = "admin显示字段"
    hero_release_date.short_description = '英雄发布时间'

5.数据库迁移和同步

安装MySQL驱动程序包
在当前虚拟环境中需要先安装MySQL的驱动程序包

pip install PyMySQL

在Django工程 settings 的相同目录中找到 init.py 文件, 并添加如下语句

import pymysql 
pymysql.install_as_MySQLdb()

作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。

在settings.py中修改DATABASES配置信息

# 数据库的配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 设置数据库引擎
        'HOST': '127.0.0.1',  # 数据库主机名
        'PORT': 3306,  # 数据库端口号
        'USER': '',  # 数据库用户
        'PASSWORD': '',  # 数据库密码
        'NAME': '',  # 创建的数据库名
    }
}

在MySQL中创建数据库
在安装好MySQL后, 打开MySQL 5.7 Comment Line Client 中输入下面命令:

create database heros charset=utf8; # heros是创建的数据库名

生成迁移文件

python manage.py makemigrations

注意:先生成迁移文件,不会再数据库中生成表。

同步数据到数据库

python manage.py migrate

注意:执行迁移,会在数据库中创建表。

⏳ 三、shell工具

Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(比如连接数据库等),以便可以直接在终端中执行测试python语句。

通过如下命令进入shell:python manage.py shell
【python】Django系列09-Django中的数据库与ORM_第6张图片

⏳ 总结

Django数据库与ORM到这里我们就全部讲完啦!!!! 如果有帮到你欢迎给个三连支持一下哦❤️ ❤️ ❤️
如果有哪些需要修改的地方欢迎指正啦!!!一起加油啦

你可能感兴趣的:(Django,数据库,django,python)