【Django学习】(五)ORM框架的配置与使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【Django学习】(五)ORM框架的配置与使用

之前学习了Django中的请求和响应方式,这次我们要学习Django中的ORM数据库框架;

日常工作中可能会遇到各种数据库,比如MySQL、oracle、mangodb、redis、sql server、db2、sqlite等等

1、回顾下pymysql第三方库如何从mysql数据库中获取数据:

a.安装pymysql模块

b.创建连接对象(添加配置)

c.创建游标对象

d.使用游标对象执行sql语句

e.获取执行结果(数据)

f.关闭游标

g.关闭连接

2、直接使用pymysql模块操作数据库,有什么痛点?

a.写sql语句非常困难

b.sql语句可能效率比较低

c.sql语句可能会有安全漏洞

d.操作数据库过程复杂

3、数据库的结构

a.一个mysql数据库管理软件中,可以有多个数据库

b.一个数据库里,可以有多张表

c.一张表里,可以有多个字段

d.一张里,可以有多个记录

一个数据库==一个配置

一张表 == 一个类

多个字段 === 一个类中多个属性

多个记录 == 一个类的多个实例对象

配置数据库信息

这里我们使用sqllite3数据库来练习,接下里进行配置

pycharm编译器中添加数据库

点击右侧的database-->点击”+“-->鼠标悬停在Data Source上-->选择SQLite

Name:设置数据库名称

File:设置sqlite的执行文件(db.sqlite3)路径

点击Test Connection 可以测试下是否连接成功,点击apply和OK即可。

配置全局配置表信息

在全局配置问价setting.py中的DATABASES中配置相应的数据库信息:

DATABASES = {
    # a.可以在DATABASES字典中添加数据库配置
    # b.子字典中的key值为数据别名,default为默认别名
    # c.value为具体的数据配置信息
    'default': {
        # d.指定数据库引擎,可以添加.mysql、.oracle、.sqlite3等
        # 'ENGINE': 'django.db.backends.mysql',
        'ENGINE': 'django.db.backends.sqlite3',
        # e.指定数据库名称,如果使用sqlite3数据库引擎,那么指定的是sqlite3数据库的路径
        'NAME': BASE_DIR / 'db.sqlite3',
        # 'NAME': 'my_django',
        # 指定数据库用户名
        # 'USER': 'keyou',
        # 指定数据库用户密码
        # 'PASSWORD': '123456',
        # 数据库主机地址(ip或者域名)
        # 'HOST': '111.122.21.1',
        # 指定数据库的监听端口,默认为3306
        # 'PORT': 3306
    }
}

所以说,如果需要用到多个数据库的话,比如多个关系型数据库就需要在DATABASES里添加一个数据库配置。

创建模型类对象

鉴于数据库不同的表字段有些事相同的,所以可以单独提出来封装一个公共类

base_model.py

from django.db import models
class BaseModel(models.Model):
    """"
    数据库公共字段
    """
    create_time = models.TimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间")
    update_time = models.TimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间")
    class Meta:
        abstract=True
        verbose_name="公共字段表"
        db_table="BaseModel"

说明:

  • 定义类属性
  • 定义Field对象作为类属性,那么一个类属性对应数据表中的一个字段
  • 默认会生成一个名为id的自增主键字段
  • models.CharField指定创建的字段为字符串类型,必须得传递max_length最大尺度
  • models.IntegerField指定创建的字段为int整数类型
  • verbose_name和help_text关键字参数,指定字段的中文注释(说明)信息,一般在后台管理站点、api接口文档平台中有应用
  • unique指定是否唯一,默认为False,如果设置为True,那么该字段不能重复设置
  • 可以使用primary_key=True,指定该字段为主键,一张表中往往只有一个主键只要设置了primary_key=True,那么ORM框架,不会自动添加名称为id的主键
  • 在日期和时间相关字段中,可以添加auto_now_add或者auto_now
  • auto_now_add指定在数据第一次创建时,自动添加创建的日期,以后更新数据记录之后,不会修改该字段
  • auto_now指定数据在每一次修改(更新)时,自动设置修改那一刻的时间
  • 一定要继承models.Model父类或者models.Model子类
  • 一个模型类,对应一张表
  • 模型类的内部类Meta:
  • 如果没有设置内部类的相关信息:
  • 生成的默认表名为子应用名_模型类敏感小写
  • 设置abstract=True
  • 指定该模型类为抽象模型类,在迁移时不会创建该表
  • 仅用于被其他类继承

需要在对应的子应用projects下面的views.py文件里创建模型类对象

from django.db import models
# Create your models here.
from utils.base_model import BaseModel
class ProjectsModel(BaseModel):
    id = models.AutoField(primary_key=True, verbose_name="id主键", help_text="id主键")
    name=models.CharField(max_length=200,verbose_name="项目名",help_text="项目名")
    leader=models.CharField(max_length=20,verbose_name="负责人",help_text="负责人")
    tester=models.CharField(max_length=20,verbose_name="测试",help_text="测试")
    programmer=models.CharField(max_length=50,verbose_name="开发人员",help_text="开发人员")
    publish_app=models.CharField(max_length=100,verbose_name="发布应用",help_text="发布应用")
    desc=models.TextField(max_length=200,verbose_name="简要描述",help_text="简要描述",blank=True,null=True,default="")
    class Meta:
        db_table = 'tb_projects'
        verbose_name = '项目信息'
        verbose_name_plural = verbose_name
    def __str__(self):
        # a.必须返回一个字符串类型
        # b.在打印模型类对象时,会自动调用
        return self.name
  • 修改表信息
  • class Meta:
  • 定义Meta内部类,Meta类名固定
  • db_table:
  • 是给该模型类对象对应的数据库表起的别名;
  • verbose_name与verbose_name_plural:
  • 指定表的中文注释(说明)信息,一般在后台管理站点、api接口文档平台中有应用

接下来进行数据库的迁移:

进行迁移:

a.生成迁移脚本:在虚拟环境中,项目根目录下,使用python manage.py makemigrations 子应用名称

b.执行迁移脚本:使用python manage.py migrate 子应用名称

c.如果不添加子应用名,那么会对所有的子应用(settings.py INSTALLED_APP列表中注册的所有子应用)进行迁移

d.如果添加子应用名,那么会对添加的子应用名进行迁移

3python manage.py sqlmigrate 子应用名,查看原生 sql语句

迁移后就是看到数据库中的对应表结构

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
141 77
|
1月前
|
存储 SQL 数据采集
Django框架的表单验证和过滤机制的原理是什么?
Django框架的表单验证和过滤机制的原理是什么?
108 73
|
1月前
|
SQL 安全 数据库连接
除了使用Django的ORM,还能通过什么方式在Django中避免SQL注入漏洞?
除了使用Django的ORM,还能通过什么方式在Django中避免SQL注入漏洞?
41 17
|
2月前
|
数据采集 中间件 Python
如何在Django框架中进行输入验证和过滤?
通过综合运用这些方法,可以在 Django 框架中有效地进行输入验证和过滤,提高应用的安全性和数据质量。同时,还可以根据具体的业务需求进一步扩展和定制验证逻辑。
133 65
|
3月前
|
搜索推荐 API 开发者
Django框架和Flask框架的适用场景分别是什么?
总体而言,Django 更适合需要全面功能和大规模开发的场景,而 Flask 则更适合灵活性要求高、小型项目或特定需求的开发。当然,具体的选择还应根据项目的具体情况、团队的技术能力和偏好等因素来综合考虑。在实际应用中,开发者可以根据项目的特点和需求,灵活选择使用这两个框架,或者结合它们的优势来构建更强大的 Web 应用程序。
161 64
|
2月前
|
监控 安全 测试技术
Django框架的表单验证和过滤机制是否可以应对复杂的安全场景?
综上所述,Django 框架的表单验证和过滤机制在一定程度上可以应对复杂的安全场景,但需要综合运用多种手段来进一步提升安全性,以适应不断变化的安全挑战。
117 52
|
2月前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
4月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
129 0
|
7月前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
116 1
|
8月前
|
存储 SQL 数据处理
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解