Django ORM数据库操作完整指南:增删改查与高级查询

落日邮差
落日邮差
发布时间:2026-10-13| 6人浏览过
原创

本文详细解析Django框架中的ORM数据库操作,涵盖数据新增、删除、修改及查询四大核心功能。重点讲解save与create方法的区别,filter与exclude的使用,以及exact、contains等过滤条件语法。同时深入介绍F对象、Q对象、聚合函数、排序及多对一/一对多关联查询的高级用法,帮助开发者掌握Django数据持久化核心技能。

本文通过具体实例深入解析Django框架中的ORM数据库操作,旨在为读者提供清晰的参考指南。

首先准备测试数据,主要涉及BookInfo(图书信息)表。

其次涉及PeopleInfo(人物信息)表,用于演示关联关系。

一.增加

1.save方法:


对象 = 模型类(
字段名 = 值,
字段名 = 值,
…
)

通过实例化对象后调用save()方法进行保存。

具体示例如下:


>>> book = BookInfo(
...     name='python入门',
...     pub_date='2010-1-1'
...   )
>>> book.save()
>>> book
<BookInfo: python入门>

2.create方法:


模型类.objects.create(
字段名 = 值,
字段名 = 值,
…
)

直接通过模型类的objects.create()创建并保存对象。


>>> PeopleInfo.objects.create(
...     name='itheima',
...     book=book
...   )
<PeopleInfo: itheima>

二.删除

1.通过模型类对象删除:

先使用get()获取特定对象,再调用delete()方法。 对象 = 模型类.objects.get(条件) 对象.delete()

具体示例如下:


>>> person = PeopleInfo.objects.get(name='传智播客')
>>> person.delete()
(1, {'book.PeopleInfo': 1})

2.通过模型类.objects.filter().delete()批量删除:

使用filter()筛选符合条件的对象集,直接调用delete()进行删除。

具体示例如下:


>>> BookInfo.objects.filter(name='python入门').delete()
(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})

三.修改

1.save方法:

先获取对象,修改其属性值,最后调用save()保存更改。 对象 = 模型类.objects.get(条件) 对象.属性 = 值 对象.save()

具体示例如下:


>>> person = PeopleInfo.objects.get(name='itheima')
>>> person.name = 'itcast'
>>> person.save()
>>> person
<PeopleInfo: itcast>

2.update方法:

使用filter()筛选对象集后调用update()直接更新属性,该方法返回受影响的行数。

具体示例如下:


>>> PeopleInfo.objects.filter(name='itcast').update(name='传智播客')

四.查询

1.基本查询

get:用于查询单一结果,若不存在则抛出DoesNotExist异常,若结果不止一个也会报错。 all:查询所有符合条件的多个结果。 count:统计结果的数量。

基本用法为:模型类.objects.get/all/count()。

2.过滤查询

filter:用于过滤出多个结果。 exclude:排除符合条件的数据,返回剩余结果。 get:用于过滤出单一结果。

3.过滤条件语法

用法格式为:属性名称__比较运算符 = 值。 exact:表示精确相等。

示例:查询编号为1的图书。


BookInfo.objects.filter(id__exact=1)

可以简写为直接指定属性值。


BookInfo.objects.filter(id=1)

contains:表示字符串包含指定子串。

示例:查询书名包含'传'字的图书。


BookInfo.objects.filter(name__contains='传')
<QuerySet [<BookInfo: 射雕英雄传>]>

startswith/endswith:分别表示以指定值开头或结尾。

示例:查询书名以'部'字结尾的图书。


>>> BookInfo.objects.filter(name__endswith='部')
<QuerySet [<BookInfo: 天龙八部>]>

isnull:判断字段是否为空。

示例:查询书名为空的图书。


>>> BookInfo.objects.filter(name__isnull=True)
<QuerySet []>

in:判断字段值是否在指定的列表中。

示例:查询编号为1、3或5的图书。


>>> BookInfo.objects.filter(id__in=[1,3,5])
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>]>

gt/gte/lt/lte:分别表示大于、大于等于、小于、小于等于的比较查询。

示例:查询编号大于3的图书。


>>> BookInfo.objects.filter(id__gt=3)
<QuerySet [<BookInfo: 雪山飞狐>]>

year/month/day/week_day/hour/minute/second:用于时间日期的特定字段查询。

示例:查询1980年发表的图书。


>>> BookInfo.objects.filter(pub_date__year=1980)
<QuerySet [<BookInfo: 射雕英雄传>]>

4.F对象和Q对象

F对象:用于在查询中比较两个字段属性(使用前需导入)。 用法:F(属性名) 示例:查询阅读量大于等于评论量的图书。


>>> from django.db.models import F
>>> BookInfo.objects.filter(readcount__gt=F('commentcount'))
<QuerySet [<BookInfo: 雪山飞狐>]>

Q对象:用于实现逻辑或(or)的查询。 用法:Q(属性名__运算符=值),也可在前面加~表示逻辑非(not)。 示例:查询阅读量大于20,或编号小于3的图书。


>>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>

5.聚合函数

聚合函数:可通过aggregate()过滤器调用聚合函数(Avg, Count, Max, Min, Sum)。 用法:模型类.objects.aggregate(聚合函数(字段名)) 示例:查询图书的总阅读量。


>>> from django.db.models import Sum
>>> BookInfo.objects.aggregate(Sum('readcount'))
{'readcount__sum': 126}

返回值为字典类型,格式为:{'属性名__聚合类小写':值}。

注意:使用count统计数量时,通常不需要使用过滤器。

示例:查询图书总数。


BookInfo.objects.count()

此时返回值为一个数字。

6.排序函数

用法:模型类.objects.all().order_by(属性名)。 默认按升序排序,若属性名前加-号则为降序。 示例:


# 默认升序
>>> BookInfo.objects.all().order_by('readcount')
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>
# 降序
>>> BookInfo.objects.all().order_by('-readcount')
<QuerySet [<BookInfo: 雪山飞狐>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 射雕英雄传>]>

7.关联查询

一到多的访问:

用法:一对应的模型类对象.多对应的模型类名小写_set。 示例:查询id为1的书籍关联的所有人物。


>>> book = BookInfo.objects.get(id=1)
>>> book.peopleinfo_set.all()
<QuerySet [<PeopleInfo: 郭靖>, <PeopleInfo: 黄蓉>, <PeopleInfo: 黄药师>, <PeopleInfo: 欧阳锋>, <PeopleInfo: 梅超风>]>

多到一的访问:

用法:多对应的模型类对象.多对应的模型类中的关系类.属性名。 示例:查询id为1的人物所属的书籍。


>>> person = PeopleInfo.objects.get(id=1)
>>> person.book.name
‘射雕英雄传'

关联过滤查询:

用法:关联模型类名小写__属性名__条件运算符=值。 示例:查询图书,要求图书中人物的描述包含"八"。


>>> book = BookInfo.objects.filter(peopleinfo__description__contains='八')
>>> book
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>]>

示例:查询图书阅读量大于30的所有人物。


>>> people = PeopleInfo.objects.filter(book__readcount__gt=30)
>>> people
<QuerySet [<PeopleInfo: 乔峰>, <PeopleInfo: 段誉>, <PeopleInfo: 虚竹>, <PeopleInfo: 王语嫣>, <PeopleInfo: 胡斐>, <PeopleInfo: 苗若兰>, <PeopleInfo: 程灵素>, <PeopleInfo: 袁紫衣>]>

希望本文所述内容能对大家基于Django的Python程序设计有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。