• Django:(07)数据库


    一、ORM框架

    ORM ,Object relational mapping 对象关系映射。

    把类和数据库表对应,把对象和表记录对应,通过类和对象操作数据库表中的数据,而不需要编写SQL语句。

     

    Django框架实现了ORM 功能:

     

    • 不需要直接面向数据库编程,通过模型类和对象完成数据表的增删改查操作;
    • 自动生成数据库表;
    • 通过配置切换使用不同的数据库。

    ORM 开发步骤:

    1. 配置数据库
    2. 定义模型类 (models.py)
    3. 执行迁移命令,生成数据库表
    4. 通过模型类和对象操作数据库

     

    二、数据库的配置

    • 手动创建 MySQL 数据库:
    create database 数据库名 charset=utf8;
    • 在与项目 setting.py 文件中配置使用mysql;
    • 在python虚拟环境下安装 MySQL 驱动
    pip install pymysql
    • 在 与项目同名的包 下的 __init__.py 文件中,初始化MySQL驱动
    pymysql.install_as_MySQLdb()

     

    四、迁移命令的使用

    • 打开终端,进入到项目manage.py所在目录下
    • 生成迁移文件
    python manage.py makemigrations
    • 生成数据库表
    python manage.py migrate

    三、定义模型类

    (1)定义属性

    • 模型类属性与表字段一 一对应
    • 定义属性时,需要指定字段类型,通过字段类型的参数指定选项,格式如下:
    属性名 = models.字段类型(字段选项)
    • 属性名不能是python的保留关键字
    • 属性名不能使用连续的下划线(这是由django的查询方式决定的)

    (2)主键

    主键:primary key,简写 pk
    不需要主动定义,django会自动生成自增长的主键,属性名叫 id,
    如果开发者自己定义了主键,则django不会再生成默认的主键

    (3)表名

    应用名小写_模型类名小写

    (4)字段类型

    类型说明
    AutoField 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建名为id的自动增长属性
    BooleanField 布尔字段,值为True或False
    NullBooleanField 支持Null、True、False三种值
    CharField 字符串,必须指定:max_length,表示最大字符个数
    TextField 大文本字段,一般超过4000个字符时使用
    IntegerField 整数
    DecimalField 十进制浮点数,用python中的Decimal实例来表示
    必须指定: max_digits总位数,decimal_places小数位数。 
    FloatField 浮点数
    DateField 日期 
    1) 参数auto_now表示每次修改保存对象时,自动设置该字段为当前时间,用于保存"最后一次修改"时间,默认为False; 
    2) 参数auto_now_add表示当对象第一次被创建时自动设置保存当前时间,用于保存"创建时间"时间,默认为值为False; 
    3) 参数auto_now_addauto_now是相互排斥的,不能同时用到一个属性中
    TimeField 时间,参数同DateField
    DateTimeField 日期时间,参数同DateField
    FileField 上传文件字段
    ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片

     

    (5)字段选项

    选项默认值描述是否要迁移修改表结构
    null False True表示表字段允许为空
    unique False True表示表字段不能重复
    db_column 属性名称 表字段名称
    primary_key False True表示字段设置为了主键,一般作为AutoField的选项使用
    default - 默认值
    blank False 在django管理后台新增或编辑一条表数据时,该字段是否允许为空;
    null是数据库范畴的概念,blank是表单验证范畴的
    choices - 在django管理后台新增或编辑一条表数据时,该字段显示为下拉框,默认为编辑框

     

    (6)外键

    关系型数据库的关系包括三种类型

    • ForeignKey: 一对多,将 关联属性 定义在多的一端中
    • ManyToManyField: 多对多,将 关联属性 定义任意一方中
    • OneToOneField: 一对一,将 关联属性 定义在任意一方中

    (7)定义一个模型类

    1、需求:

    保存部门-员工数据

    • 部门类(Department)

      • 部门名称: name
      • 部门成立时间: create_date
      • 逻辑删除标识:is_delete
    • 员工类(Employee)

      • 姓名: name
      • 年龄: age
      • 性别: sex
      • 工资: salary
      • 入职时间: hire_date
      • 备注信息: comment

    2、代码:

    class Department(models.Model):
        """部门类"""
    
        # 部门名称:字符串类型(必须要指定最大长度)
        name = models.CharField(max_length=20)
        # 部门成立时间: 日期类型
        create_date = models.DateField(auto_now_add=True)
        # 逻辑删除标识:标识部门是否删除
        is_delete = models.BooleanField(default=False)
    
        def __str__(self):
            return self.name
    
        class Meta: 
            # 指定表名
            db_table = 'department'
    
    class Employee(models.Model):
        """员工类"""
    
        choices_gender = (
            (0, ''),
            (1, ''),
        )
    
        name = models.CharField(max_length=20)
        age = models.IntegerField()
        gender = models.IntegerField(default=0, choices=choices_gender)
        # 工资:浮点类型(必须要指定两个选项)  
        salary = models.DecimalField(max_digits=8, decimal_places=2)
        # 备注信息: 可以为空
        comment = models.CharField(max_length=300, null=True, blank=True)
        # 员工入职时间
        hire_date = models.DateField(auto_now_add=True)
        # 一对多的外键:员工所属部门 department_id
        department = models.ForeignKey('Department')
    
        def __str__(self):
            return self.name
    
        class Meta: 
            # 指定表名
            db_table = 'employee'

    四、执行迁移命令,生成数据库表

    • 打开终端,进入到项目manage.py所在目录下
    • 生成迁移文件
    python manage.py makemigrations
    • 生成数据库表
    python manage.py migrate
    • 默认数据库为 sqlite3,数据库名为:db.sqlite3,可在配置中设置为自定义。

    五、通过模型类和对象操作数据库

    (1)模型类管理器Manager的作用


    每个模型类默认都有一个叫 objects 的类属性,它由django自动生成
    我们把 objects 称为 模型管理器,其类型为: django.db.models.manager.Manager
    通过objects属性,可以实现对数据库相关的操作

    objects管理器中的方法返回类型作用
    模型类.objects.create() 模型类对象 创建一个对象(新增一条数据)
    模型类.objects.get() 模型对象 查询一个对象,且只能有一个: 
    如果查到多条数据,则报:MultipleObjectsReturned 
    如果查询不到数据,则报:DoesNotExist
    模型类.objects.all() QuerySet 查询所有的对象
    模型类.objects.count() 数字 查询总共有多少条数据
    模型类.objects.filter() QuerySet 查询满足条件的对象
    模型类.objects.exclude() QuerySet 查询不满条件的对象
    模型类.objects.order_by() QuerySet 对查询结果集进行排序
    模型类.objects.aggregate() 字典,例如:
    {'salary__avg': 9500.0}
    进行聚合操作
    Sum, Count, Max, Min, Avg

     

    (2)查询集QuerySet的特点

    1、基本使用

    当调用模型管理器的 all, filter, exclude, order_by等方法时,返回的是一个 QuerySet 对象,表示从数据库查询到的数据集合;

    objects管理器中的方法返回类型作用
    模型类.objects.all() QuerySet 查询所有的对象
    模型类.objects.filter() QuerySet 查询满足条件的对象
    模型类.objects.exclude() QuerySet 查询不满条件的对象
    模型类.objects.order_by() QuerySet 对查询结果集进行排序


    QuerySet 提供的方法(支持链式写法)

    QuerySet方法返回类型作用
    get() 模型对象 查询一个对象,且只能有一个: 
    如果查到多条数据,则报:MultipleObjectsReturned 
    如果查询不到数据,则报:DoesNotExist
    all() QuerySet 查询所有的对象
    count() 数字 查询总共有多少条数据
    filter() QuerySet 查询满足条件的对象
    exclude() QuerySet 查询不满条件的对象
    order_by() QuerySet 对查询结果集进行排序
    aggregate() 字典,例如:
    {'salary__avg': 9500.0}
    进行聚合操作 Sum, Count, Max, Min, Avg
    exists() 布尔型 True表示有查询集中有数据,否则没有

    支持 下标 和 切片 操作
    query_set[0]:取出查询集中的第一条数据,不存在会抛IndexError异常
    query_set[0:2]:切片操作得到另一个新的QuerySet
    注意:下标不能为负数


    2、查询集的两大特性

    惰性查询:
    创建查询集时不会访问数据库,操作查询集中的数据时才会访问;
    操作查询集指 下标、切片、迭代操作,与if合用 等

    缓存功能:
    当遍历(迭代)访问查询集 所有数据,会缓存查询集所有数据,当再次操作该查询集中的数据时,将会使用缓存;
    如果只是访问查询集 部分数据(下标或切片)不会缓存

    (3)用ORM进行数据库的增删改查


    模型类对象.save()
    模型类.objects.create(属性1=值1,属性2=值2, ...)



    模型类对象.delete()
    模型类.filter(条件).delete()



    模型类对象.save()
    模型类.filter(条件).update(属性1=值1,属性2=值2, ...)



    条件查询
    调用 filter方法: 模型类.objects.filter(模型类属性名__条件名=值)
    返回包含查询结果数据的 QuerySet 对象
    F对象
    F对象:比较表中的两个字段,接收的参数为一个字符串
    用法: F('属性名')
      比如:成绩表.objects.filter(语文__gt=F('数学'))
      需要导包: from django.db.models import F
    Q对象
    作用: 对查询条件进行 与 或 非 (& | ~) 的逻辑操作
    用法: 先导入 from django.db.models import Q
      与: Q(查询条件1) & Q(查询条件2)
      或: Q(查询条件1) | Q(查询条件2)
      非: ~Q(查询条件)
    聚合
    作用: 聚合操作,对多行查询结果中的一列进行操作,返回一个值
    用法: 模型类.objects.aggregate(聚合类('属性名'))
      常用聚合类有:Sum, Count, Max, Min, Avg等
      返回值是一个字典, 格式: {'属性名__聚合函数': 值}
      使用时需要先导入聚合类: from django.db.models import Sum, Count, Max, Min, Avg
    排序
    作用: 对查询结果进行排序,默认为升序
    用法:
      升序: 模型类.objects.order_by('属性名')
      降序: 模型类.objects.order_by('-属性名')
    关联查询
    通过 对象 进行关联查询
      由 一类对象 查询 多类对象: 一类对象.多类名小写_set.all()
      由 多类对象 查询 一类对象: 多类对象.关联属性
    通过模型类实现上述两个案例
      一类名.objects.filter(多类名小写__多类属性名__条件名=值)
      多类名.objects.filter(关联属性__一类属性名__条件名=值)

    推荐阅读:《Django模型》http://www.runoob.com/django/django-model.html

  • 相关阅读:
    纪中培训 8月8日 day3 考试
    【置顶】博客搬迁
    图论②——??? (poj 3662)
    图论①——??? (2750: [HAOI2012]Road)
    树形dp①
    区间dp②
    区间dp①
    线性dp②
    字符串算法①——kmp
    图论——最小生成树①
  • 原文地址:https://www.cnblogs.com/mzfly/p/9995527.html
Copyright © 2020-2023  润新知