作者:爱编程的小贤
⛳知识点:Django–数据库与ORM
:每天学一点,早日成大佬
今天我们进入Django数据库与ORM的学习啦!!! 学习之前先要好好复习回顾前面的内容哦!!!
如果你看完感觉对你有帮助,,,欢迎给个三连哦!!!您的支持是我创作的动力。 感谢感谢!!!
ORM,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作为实例,把字段作为属性,ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
用于实现面向对象编程语言里不同类型的数据之间的转换。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
不需要直接面向数据库编程而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
1. ORM会将Python代码转成为SQL语句。
2. SQL语句通过pymysql传送到数据库服务端。
3. 在数据库中执行SQL语句并将结果返回。
如果我们使用ORM来映射对应关系,就需要先设计出一个模型类,这个模型类实际上是一个业务的集合,我们需要把各种属性抽象出来,然后通过一些对应的字段参数去实现。
例如:我们想设计一个游戏英雄的模型类,那么首先需要抽象出一个英雄类,同时也要设计出英雄的属性信息。
一个英雄模型类的字段信息:英雄名称、英雄价格、使用次数、胜利次数、发布日期等。
一个英雄模型类的元属性:类所映射的数据库表名、英雄模型类的别名。
一个英雄模型类的返回信息:英雄模型类实例的返回信息,一般返回名称,例如返回英雄名称。
使用django进行数据库开发的步骤如下:
配置数据库连接信息
在models.py中定义模型类
迁移
通过类和对象完成数据增删改查操作
类型 | 说明 |
---|
外键设置
在设置外键时,需要通过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对应的是数据库表的表名,也就是说可以通过修改它的值来修改数据库表名
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 = '英雄发布时间'
安装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
注意:执行迁移,会在数据库中创建表。
Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(比如连接数据库等),以便可以直接在终端中执行测试python语句。
通过如下命令进入shell:python manage.py shell
Django数据库与ORM到这里我们就全部讲完啦!!!! 如果有帮到你欢迎给个三连支持一下哦❤️ ❤️ ❤️
如果有哪些需要修改的地方欢迎指正啦!!!一起加油啦