软件测试

4、Django之ORM框架

2020-08-31  本文已影响0人  小啊小狼

一、定义

对象关系映射(Object Relational Mapping,简称ORM)模式的作用是在关系型数据库与业务实体对象之间进行映射
通过类和对象就能操作它所对应数据表中的数据(CRUD)

二、数据迁移

1.配置数据库连接信息

创建数据库

配置数据库:需要在全局settings.py中的DATABASES字段中配置数据库信息

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'HOST': 'localhost',
        'PORT': 3306,
        'USER': 'admin',
        'PASSWORD': '123456'
    }
}

安装mysqlclient

需要满足的依赖

# Debian/Ubuntu
sudo apt-get install python-dev default-libmysqlclient-dev
# Red Hat/CentOS
sudo yum install python-devel mysql-devel
# macOS (HomeBrew)
brew install mysql-client
pip install mysqlclient

2.在models.py中定义模型类

2.1、可以在子应用projects/models.py文件中定义数据模型
2.2、一个数据模型类对应一个数据表
2.3、数据模型类,需要继承Model父类或者Model子类
2.4、在数据模型中,添加的类属性(Field对象)来对应数据表中的字段

from django.db import models

class Projects(models.Model):
    name = models.CharField(max_length=200)
    age = models.CharField(max_length=50)

3.迁移

# 生成迁移脚本
python manage.py makemigrations
# 生成数据表
python manage.py migrate

terminal执行以上两条命令,则在数据库生成对应的表

上面生成迁移脚本和创建数据库表的命令行都是针对所有的,如果只想创建某一个子应用的表呢?只需要在上面的命令行后面跟上子应用名即可

# 生成指定应用的迁移脚本
python manage.py makemigrations 子应用名称
# 生成指定应用的数据表
python manage.py migrate
子应用名称

4、表的创建

在第二步的迁移步骤中,已经实现了如何通过数据模型创建数据库表,我们知道数据库表字段有各种属性,如长度、字符类型、约束条件、默认值等等,在Django的数据模型中,我们并不需要去编写sql语句来创建数据库表,而是可以通过类和对象的方式进行数据库的增删改查等操作,这样就方便了许多。

AutoField类、CharField类、IntegerField类、TextField类、DecimalField类、DateTimeField类、DateField类、TimeField类等等,它们都继承了Field父类,我们通过查看Field源码的构造方法,可以看到很多关于字段的属性设置

def __init__(self, verbose_name=None, name=None, primary_key=False,
                 max_length=None, unique=False, blank=False, null=False,
                 db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
                 serialize=True, unique_for_date=None, unique_for_month=None,
                 unique_for_year=None, choices=None, help_text='', db_column=None,
                 db_tablespace=None, auto_created=False, validators=(),
                 error_messages=None):

而DateTimeField类、TimeField类也继承了DateField类,DateField类中的构造方法也有新的参数

5.修改表名

按照上面的操作生成的数据库表的表名默认为:子应用名称_模型类名小写,如果想自定义表名,只需要在数据模型类下面定义一个Meta的子类

from django.db import models


class Projects(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200, verbose_name="项目名称", help_text='项目名称', unique=True)
    leader = models.CharField(max_length=50)
    programmer = models.CharField(max_length=50, verbose_name="开发人员", help_text="开发人员")
    tester = models.CharField(max_length=50, verbose_name="测试人员", help_text="测试人员")
    desc = models.TextField(verbose_name='项目简介', help_text="项目简介", blank=True, default="XXXX", null=True)
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间")

    class Meta:
        # Meta子类的类名固定,可以使用db_table类属性来指定表名,使用verbose_name类属性指定表的个性化描述
        db_table = 'tb_projects'
        verbose_name = '项目表'

三、CRUD

在CRUD操作之前,为了更好的debug,我们可以引入connection模块,它可以在我们进行CRUD操作时,会显示出对应的sql语句,通过sql语句,可以及时发现错误,也可以看到sql语句的性能是否达到最优

在视图模块中引入connection模块

from django.db import connection

调试器上添加“connetion.queries”:


image.png

1.c(create)

向数据表添加一条记录,两种方法

project_obj = Projects(name='xxx项目3', leader='xxx项目负责人3',tester='xxx测试3', programmer='xxx研发3')
project_obj.save()
project_obj = Projects.objects.create(name='xxx项目4', leader='xxx项目负责人4',tester='xxx测试4', programmer='xxx研发4')

2.u(update)

project_obj = Projects.objects.get(id=3)
project_obj.name = '某某知名项目'
project_obj.save()
Projects.objects.filter(id=2).update(name='某某优秀的项目')

3.r(retrieve)

1. 获取所用记录--all()方法:qs = Projects.objects.all()
2. 获取指定记录
project_obj = Projects.objects.get(id=1)
Projects.objects.exclude(id=1)
3.关联查询
4.逻辑关系查询
qs =Projects.objects.filter(name__startswith='x').filter(programmer__contains='4')
qs = Projects.objects.filter(name__startswith='x', programmer__contains='4')
from django.db.models import Q
Projects.objects.filter(Q(leader__contains='1') | Q(programmer__contains='4'))
5.聚合查询

首先导入聚合函数

from django.db.models import Count,Sum,Max,Min,Avg
Projects.objects.annotate(Count("name"))
Projects.objects.annotate(Max("name"))
6.排序
Projects.objects.all().order_by('-name')

4.d(delete)

 project_obj = Projects.objects.get(id=3)
 one = project_obj.delete()
Projects.objects.filter(id=3).delete()
上一篇 下一篇

猜你喜欢

热点阅读