【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语句

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高老庄里的高小翠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值