Django_数据库配置_ORM框架(个人学习笔记)

Posted 七月的小尾巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django_数据库配置_ORM框架(个人学习笔记)相关的知识,希望对你有一定的参考价值。

ORM框架

之前的学习中,我们所有的请求数据都是写死的,在实际工作中,我们所有的数据都是存放在数据库中,本章节,我们将了解 Django中的 ORM框架,来实现接口中数据的增删改查。

什么是ORM?

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。

ORM框架:为了解决面型对象与关系数据库存在的互不匹配的现象的框架。

为什么要使用 ORM?

当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。

数据库配置

如果需要配置 mysql数据库的话,则按照如下的方法配置,这里是自己学习,因为原先配置暂时不动,默认使用 sqlite3。

在 setting.py 文件中找到 DATABASES 配置。

DATABASES = 
    # 指定数据库别名/标签
    # 指定的是 django 默认使用的数据库
    'default': 
        # 指定当前使用的数据库引擎
        # (可指定引擎: 'django.db.backends.mysql、oracle、sqlite3')
        'ENGINE': 'django.db.backends.mysql',
        # 指定数据库名称,如果使用的 是sqlite3,需要指定 sqlite3文件的绝对路径
        'USER': "root",
        "PASSWORD": "123456",
        "PORT": 3306,
        
    ,


首先我们来创建一个数据库表,需要在子应用中的 model.py 中去定义 Animal 的数据库模型。

from django.db import models


class Animal(models.Model):
    """
    1) 一般在 子应用中的 modles 中定义模型类,相当于是我们数据库中的一张表
    2)必须要继承 Model 或者 Model 子类
    3)在模型类中定义类属性,需要注意,必须要定义为 filed 子类,他相当于我们数据表中的字段
    """
    name = models.CharField(max_length=50) # 字符串,长度 50 -> 对应 mysql中的varchar类型
    age = models.IntegerField() # integer 类型 
    gender = models.BooleanField() # bool类型

创建完成之后,我们执行如下命令

python manage.py makemigrations [子应用名称(如果不加,会将所有的子应用生成迁移脚本)]

如,我的子应用名称为 project。那么命令如下 python manage.py makemigrations project,运行名称之后,我们可以看到 migrations 中会生成一个迁移脚本。

我们在来运行迁移脚本

python manage.py migrate [子应用名称]

执行迁移脚本之后,则已经在数据库中创建了该表信息,此时我们可以通过 pycharm 去连接数据库。



注意,我这里之前安装过驱动,如果有提示安装drvier,需要先安装一下驱动 ,这里我已经安装过了,就不能提供截图了,在选择 sqlLite之后,弹窗中会有提示。

确认好了之后,我们可以看到已经生成了对应的表名称了


那么我们已经创建了迁移脚本了,如果说我们想看一下对应的中的sql呢?django 也提供了内置的方法。

python manage.py sqlmigrate [子应用名称] [迁移脚本名称]
// 按照我们上方的例子
python manage.py sqlmigrate project 0001_initial


创建数据库表 整体流程

  1. 在子应用中创建 model.py 文件,定义模型类
  2. 定义模型类之后,执行命令,生成迁移脚本。python manage.py makemigrations [子应用名称]
  3. 执行迁移脚本。 python manage.py migrate [子应用名称]
  4. 生成的数据表名称规则: 默认为当前 “子应用名_模型类名”
  5. 生成表之后,我们可以看到默认会自增一个 id。

上方我们只是定义了一个简单的模型类,下面我们根据侧开平台中的功能,创建一个新的项目模型类。

class Project(models.Model):
    
    name = models.CharField(max_length=20, verbose_name="项目名称", help_text="项目名称", unique=True)
    leaders = models.CharField(max_length=20, verbose_name="负责人名称", help_text="负责人名称", unique=True, blank=True)
    is_run = models.BooleanField(verbose_name="是否启动项目", help_text="是否启动项目", default=True,  null=True)
    desc = models.TextField(verbose_name="项目描述信息", help_text="项目描述信息")
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)
  1. 当前这个 CharField 类型必须要指定 max_length
  2. 如果我们需要指定这个字段为 唯一约束,那么我们可以设置 unique=True ,默认是 False。
  3. 可以使用 default 指定默认值,如果指定默认值之后,在创建记录的时候该字段不传递则会使用默认值。
  4. 如果我们希望这个参数我们允许他传 null,可以使用 null=True ,默认为 False, DRF进行返序列化输入时才有效。
  5. 如果希望这个参数允许他传 空字符串,则可以使用 blank=True ,默认为 False,DRF进行返序列化输入时才有效
  6. 如果我们定义的这个参数,他的内容非常长,那么我们可以使用 TextField,这个是针对超长文本设定的字段

通常我们表中会设计到创建时间和更新时间

  • 在 DateTimeField 中使用 auto_now_add=True时,则在创建记录的时候,会自动加上创建时间,后续在做修改操作时,也不会在修改
  • 在 DateTimeField 中使用 auto_now=True时,则在修改记录的时候,会自动加上修改时间。

上面如果有细心的小伙伴会发现,我们之前的表名称,是自动生成的。默认是 子应用名称_模型类名称小写,那么如果我们想要自定义名称,django框架中支持吗?如果支持应该怎么实现呢?

class Project(models.Model):
    # 当前这个 CharField 类型必须要指定 max length
    name = models.CharField(max_length=20, verbose_name="项目名称", help_text="项目名称", unique=True)
    is_run = models.BooleanField(verbose_name="是否启动项目", help_text="是否启动项目", default=True)
    desc = models.TextField(verbose_name="项目描述信息", help_text="项目描述信息", null=True, blank=True)

    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)
    
    # 类名称 Meta 固定
    class Meta:
        # 自定义数据库表名称
        db_table = 'tb_project'
        # 为当前数据表设置描述信息
        verbose_name = "项目表"
        verbose_name_plural = "项目表"

我们可以在 原先的 Project 模型类中在定义一个 Meta的子类。 Meta 子类中提供了非常多的内置参数,我们可以通过内置的方法去修改表名称。

并且上方我们的 主键ID也是自定生成的,如果我们想要自定义的话,django中同样也支持。

class Project(models.Model):
    # 我们可以自己在这里定义主键
    ids = models.IntegerField(primary_key=True, verbose_name="项目主键", help_text="项目主键")

此时小伙伴会不会有疑惑,按照上方的流程走下来,我们确实可以创建一个数据库的表,但是日常工作中,我们生成迁移脚本之后,可能还会出现需要新增或者修改表中的某个字段,那么这种情况下,我们应该怎么做呢?

注意:通常公司来说,是不能随意修改字段的,但是如果一定要修改的情况下,我们需要做数据备份。避免在修改过程中造成数据丢失。

下面假设我们需要修改 project 中的主见,原先的主键是 id,我们需要修改成 ids,需要增加一个 defalut 默认值

class Project(models.Model):
    # 我们可以自己在这里定义主键
    ids = models.IntegerField(primary_key=True, verbose_name="项目主键", help_text="项目主键", defalt=1)

我们修改之后,按照之前同样的逻辑,需要先执行命令生成迁移脚本

python manage.py makemigrations [子应用名称] 

然后再执行迁移脚本,这样就ok了

 python manage.py migrate [子应用名称] 

总结

本章节我们初步了解了 ORM框架,以及如果定义模型类和生成迁移脚本,下一章节,我们会讲 ORM 框架中的 关键字段、CRUD操作。

以上是关于Django_数据库配置_ORM框架(个人学习笔记)的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记30_ORM框架

Web框架之Django_02基本操作(Django项目启动配置数据库连接orm增删改查)

Python学习笔记八:ORM框架SQLAlchemy

学习笔记31_ORM框架ModelFirst设计数据库

python 之 Django框架(orm单表查询orm多表查询聚合查询分组查询F查询 Q查询事务Django ORM执行原生SQL)

python django框架学习笔记--大结局