django--ORM

1. 什么是ORM?

ORM( Object Relational Mapping ),即对象关系映射,ORM框架在面向对象编程语言和关系数据库之间充当了一个桥梁的作用,它把关系型数据库的表结构映射到了对象实体上,这样我们可以通过操作对象来操作数据库。

ORM的作用:

ORM可以把我们从SQL语句的编写中解放出来,例如增删改查、SQL表间关系的操作、数据类型的转换操作等等,通过ORM框架使用Python的面向对象编程语言来实现数据库操作。

2. Django的ORM模块

Django的ORM模块是Django框架中提供的一种操作数据库的方式,它抹平了程序员对于不同关系型数据库的差异性,提供了一种统一的数据访问API,完全基于面向对象思想,让使用者能够以自然的方式对SQL进行操作,而不需要过于关注SQL的具体细节。

2.1 配置ORM

在配置ORM之前,首先需要安装数据库引擎,例如MySQL或SQLite等。Django默认使用的是SQLite数据库。

在settings.py中使用DATABASES配置数据库的连接信息:

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': BASE_DIR / 'db.sqlite3',

}

}

ENGINE:表示数据库引擎,比如MySQL、SQLite、Oracle等。

NAME:表示数据库名,例如上面的‘db.sqlite3’。

2.2 创建ORM模型

Django的ORM模型是通过Python面向对象的方式操作数据库,其每一个模型类代表着数据库中的一张数据表。如果想要操作某个数据表,我们就需要定义一个与之对应的模型类。

以User表为例,来定义一个User模型类:

from django.db import models

class User(models.Model):

name = models.CharField(max_length=20)

age = models.IntegerField()

class User(models.Model):定义了一个继承自models.Model的User模型类,其中Model是Django框架中提供的一个基类,主要作用是将模型类转换成数据表,它封装了常用的数据库操作,如增删改查等。

2.3 同步ORM模型与数据库

在创建好模型后,我们需要将其同步到数据库中,这样Django才知道对应的数据结构。ORM模块提供了一个简单的命令可以实现同步操作,即makemigrations和migrate。

在终端中执行以下操作:

# 生成迁移文件(记录了对数据库的更改)

python manage.py makemigrations

# 执行迁移文件,将模型同步到数据库中

python manage.py migrate

3. Django ORM的常见操作

3.1 数据的增删改查

ORM的常见操作包括增删改查,Django ORM也提供了这些操作。

3.1.1 查询

Django ORM中提供了filter和get方法来进行查询操作,其中filter返回满足条件的一个QuerySet对象,而get返回单个结果对象。

以查询年龄大于18岁的用户为例:

users = User.objects.filter(age__gt=18)

其中filter方法中age__gt=18表示年龄大于18。

查询年龄等于18岁并且名字为‘Tom’的用户:

user = User.objects.get(age=18, name='Tom')

其中get方法要求结果唯一,如果查询出多个结果,会抛出MultipleObjectsReturned异常;如果没有查询到结果,则会抛出DoesNotExist异常。

3.1.2 插入

插入一条记录,需要创建一个模型实例,并调用save()方法:

user = User(name='Lucy', age=20)

user.save()

3.1.3 修改

修改指的是在数据库中对指定记录的某些字段进行修改,首先需要获取到需要修改的记录:

user = User.objects.get(id=1)

然后修改对应的字段,并调用save()方法即可完成修改:

user.age = 22

user.save()

3.1.4 删除

删除指的是在数据库中删除指定记录,Django ORM提供了delete()方法来进行删除操作。以删除年龄大于18岁的用户为例:

users = User.objects.filter(age__gt=18)

users.delete()

3.2 多表操作

在数据库中,一个模型类对应的表不一定满足我们的需求,可能会涉及到多表的联合查询等操作。Django ORM对此提供了简便的实现方式,即ForeignKey外键和ManyToManyField字段。

3.2.1 ForeignKey外键

ForeignKey外键用于在多张表中建立联系,例如一个Course表和一个Teacher表,一个教师可以教授多门课程,而一门课程只能由一个教师授课。那么这时一个课程就可以有一个外键teacher,对应着教师表中的主键id。

Course模型类可能会长这样:

class Course(models.Model):

name = models.CharField(max_length=100)

teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)

这样,我们通过Course模型类就能够访问到教师表中的信息。

3.2.2 ManyToManyField字段

ManyToManyField字段用于多对多的关系,例如一个学生可以报名多个课程,而一个课程也可以被多个学生报名。当出现这样的情况时,我们可以在学生表和课程表中都添加一个ManyToManyField字段,例如Student.course和Course.student,表示学生和课程之间的关系。

Course模型类可能会长这样:

class Course(models.Model):

name = models.CharField(max_length=100)

students = models.ManyToManyField(Student)

这样,我们通过Course模型类就能够访问到所有报名这门课程的学生信息。

3.3 查询优化

Django ORM提供了一些查询优化的手段以提高性能。

3.3.1 select_related

select_related方法用于在查询时将指定的关联数据也先查询出来,这样不会在后面的操作中多次查询数据库,从而提高了查询效率。

例如查询所有选了某门课程的学生:

students = Student.objects.filter(course__name='Python').select_related('course')

其中select_related('course')表示将course表的信息一并查询出来。

3.3.2 prefetch_related

prefetch_related方法用于在查询时一次性将关联的所有数据查询出来,并将其缓存起来,同时还可以进行一些设置,如限制查询的数量等。

例如查询所有学生选的所有课程:

students = Student.objects.prefetch_related('course_set')

其中prefetch_related('course_set')表示将和当前查询集有关系的course_set数据预先给取出来。

3.3.3 使用索引

在进行大数据量的操作时,正确地使用索引是提高性能的关键。在Django ORM中,可以在模型类中进行配置:

class User(models.Model):

name = models.CharField(max_length=20, db_index=True)

age = models.IntegerField()

在这里我们将name这一字段配置为索引,这样在进行查询时就会更加高效。

4. 总结

本文主要介绍了ORM的概念、Django ORM的使用以及常见的增删改查、多表操作和查询优化等内容。ORM将关系型数据库的表结构映射到了对象实体上,让我们更加方便和自然地操作数据库。Django ORM模块简化了数据库的操作,提供了一种统一的数据访问API,使我们能够以自然的方式对SQL进行操作。

后端开发标签