Django 模型

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

Django ORM

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

使用 ORM 的好处

  1. 提高开发效率。
  2. 不同数据库可以平滑切换。

使用 ORM 的缺点

  1. ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
  2. 长期写 ORM 代码,会降低编写 SQL 语句的能力。哈哈,我自己SQL能力不强。

ORM 解析过程

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

数据库配置

  1. 创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)
    create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

  2. 修改项目的 settings.py 文件中找到 DATABASES 配置项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DATABASES = { 
    'default':
    {
    'ENGINE': 'django.db.backends.mysql', # 数据库引擎
    'NAME': 'name', # 数据库名称
    'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
    'PORT': 3306, # 端口
    'USER': 'root', # 数据库用户名
    'PASSWORD': '123456', # 数据库密码
    }
    }
  3. 使用 pymysql 模块连接 mysql 数据库

    1
    2
    3
    # 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
    import pymysql
    pymysql.install_as_MySQLdb()

Model => DB

  1. 生成迁移文件
    python manage.py makemigrations
  2. 执行迁移
    python manage.py migrate

迁移原理:
⑴ 根据既有迁移和Model进行对对,生成新的迁移文件
⑵ 去数据库查询执行记录,直接过滤掉已执行过的迁移文件
⑶ 执行未执行的迁移文件,并记录

DB => Model

  1. 直接生成Model
    python manage.py inspectdb -> models.py
  2. 生成的Model 拥有元信息 manage=False 不需要迁移系统管理

模型关系

1:1

1
2
3
4
5
6
7
class Person(models.Model):
p_name = models.CharField(max_length=16)
p_sex = models.BooleanField(default=False)

class IDCard(models.Model):
id_num = models.CharField(max_length=18, unique=True, )
id_person = models.OneToOneField(Person, on_delete=models.SET_NULL, blank=True, null=True)
  • OneToOneField
  • 确定主从关系
  • 底层实现 —–> 从表中声明外键并添加唯一约束
  • 从获取主:显性属性
    主获取从:隐性属性,默认就是表模型名小写
  • 从表删除数据:主表不受影响
    主表删除数据:

1:M

1
2
3
4
5
6
class Grade(models.Model):
g_name = models.CharField(max_length=16)

class Student(models.Model):
s_name = models.CharField(max_length=16)
s_grade = models.ForeignKey(Grade, on_delete=models.SET_NULL, blank=True, null=True)
  • 直接使用外键实现 - ForeignKey
  • 主从获取

M:N

1
2
3
4
5
6
class Customer(models.Model):
c_name = models.CharField(max_length=16)

class Goods(models.Model):
g_name = models.CharField(max_length=16)
g_customer = models.ManyToManyField(Customer)
  • ManyToManyField, 两张以上的表的对应关系。
  • 会产生额外的关系表,表中使用多个外键实现,外键对应关系表的主键。
  • 主从获取

模型继承

  • Django中模型支持继承
  • 默认继承是会将通用字段放到父表中,特定字段放在自己的表中,中间使用外键链接
    • 关系型数据库关系越复杂,效率越低,查询越慢
    • 父类表中也会存储过多的数据
  • 使用元信息解决问题
    • 使模型抽象化
    • 抽象的模型就不会在数据库中产生映射
    • 子模型映射表中直接包含父模型的字段