Django之ORM框架

一、定义

  • 把类和数据表进行映射
  • 通过类和对象就能操作它所对应表格中的数据(CRUD)

二、数据迁移

1.配置数据库连接信息

  • 创建数据库和用户
CREATE DATABASE my_django charset=utf8;
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '123456';
flush privileges;

  • 配置数据库

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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_django',
        '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中定义模型类

  • 可以在子应用projects/models.py文件中定义数据模型
  • 一个数据模型类对应一个数据表
  • 数据模型类,需要继承Model父类或者Model子类
  • 在数据模型中,添加的类属性(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

  执行以上两条命令过程如下:

  然后进入刷新数据库后,可以看到有对应的表已经成功创建:

  再看看刚刚创建的表结构:

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

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

  执行指定的迁移脚本还有另一种命令行,迁移脚本要先生成出来才能生效,生成的迁移脚本会存放在子应用目录下的migrations下

python manage.py sqlmigrate 子应用名称 迁移脚本

3.表的创建

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

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

   这里拿出常用的属性进行说明:

  • verbose_name:个性化信息
  • primary_key:主键约束,如果某一个字段中设置了primary_key=True,那么Django就不会自动创建id字段
  • max_length:至少要指定一个该字段,它代表此字段的最大长度,不能为负数,最大长度不能超过200
  • unique:唯一键约束
  • blank:指定前端用户在创建数据时,是否需要传递,默认需要传递,如果不传递,设置为True
  • null:指定数据在保存时是否可以为空,默认不能为空,为空设置为True
  • default:指定默认值,往往会跟black一起使用
  • help_text:帮助文本信息,在api接口文档平台和admin后端站点中会用于提示,往往跟verbose_name一致

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

  其中:

  • auto_now:设置成True后,Django会自动添加更新记录时的时间
  • auto_now_add:设置成True后,Django会自动添加创建记录时的时间

  我们开始通过数据模型自定义一些字段:

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="更新时间")

  同样进行数据迁移,得到的结果:

3.修改表名

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

1.c(create)

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

  1.使用模型类对象来创建

  2.使用查询集的create方法

2.r(retrieve)

  • 获取一个数据表的所有记录
    • 返回所有记录组成的模型对象集合(queryset查询级)
  • 获取指定记录
    • get
    • filter
    • exclude

  查询操作通过在视图方法中使用创建数据模型对象的方式,去调用它的get/filter/exclude方法

get:(1)一般只能使用主键或者唯一键作为查询条件;(2)如果查询的记录为空或者多条记录,会抛出异常;(3)返回的模型类对象,会自动提交

filter:通过过滤的方式查询,每个字段都提供了很丰富的选项进行查询操作

exclude:与filter相反,为反向过滤

  先提前在数据库创建几条数据:

1.get方法

2.filter方法

3.exclude方法

3.u(update)

1.先获取模型类对象,然后修改某些字段,再调用save方法保存

2.可以使用模型类名.objects.filter().update()

显然第二种更好,sql语句性能优越

4.d(delete)

1.获取模型类对象,然后删除

2.可以使用模型类名.objects.filter().delete()

posted @ 2020-06-21 20:50  小公瑾  阅读(454)  评论(0编辑  收藏  举报