Django ORM 映射原理与模糊查询实战指南

半杯拿铁
半杯拿铁
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析 Django 中的 ORM 映射机制,阐述其作为 SQL 封装的优势与性能权衡。重点详解 filter()、exclude() 及 get() 方法的使用,系统梳理 __exact、__contains 等模糊查询参数,并展示聚合函数与去重操作,帮助开发者高效进行数据库交互。

Django ORM 映射基础

ORM 映射

ORM(对象关系映射)在笔者看来,本质上是对 SQL 语句的一种封装。开发者编写的代码与底层执行的 SQL 语句在逻辑含义上保持一致,这种机制极大地简化了开发流程,提升了编码效率。然而,这种便利性也伴随着一定的代价,即可能会导致程序运行效率的相对下降。例如:


UserInfo.objects.get(id=2)

等于


select * from user_userinfo where id=2

修改管理器(models.py)

导入新的包:from django.db import models

Django 模糊查询详解

进行模糊查询

在执行查找操作之前,我们需要先了解 filter() 方法。

这是一个过滤器方法,主要用于筛选出符合特定条件的数据元素。

值得注意的是,其内部支持通过‘__方法名称'的引用方式来调用各种内置函数。

__exact 精确等于 like ‘aaa'

__iexact 精确等于 忽略大小写 ilike ‘aaa'

__contains 包含 like ‘%aaa%'

__icontains 包含 忽略大小写 ilike ‘%aaa%',但对于 sqlite 数据库而言,contains 的作用效果等同于 icontains。

__gt 大于

__gte 大于等于

__lt 小于

__lte 小于等于

__in 存在于一个 list 范围内

__startswith 以…开头

__istartswith 以…开头 忽略大小写

__endswith 以…结尾

__iendswith 以…结尾,忽略大小写

__range 在…范围内

__year 日期字段的年份

__month 日期字段的月份

__day 日期字段的日

__isnull=True/False

举几个例子:


obj1 = UserInfo.objects.filter(user_name__contains='王')#以‘王'开头的user__name
obj2 = UserInfo.objects.filter(user_name__endswith='王')#以‘王'结尾的user__name
obj3 = UserInfo.objects.filter(id__gte=5)#ID大于等于5的
obj5 = UserInfo.objects.filter(id__exact=5)#id等于5的
obj6 = UserInfo.objects.filter(id__in=[1,3,5])#id等于1,3,5,的

排除与聚合操作

exclude 方法,用于排除特定选项。


obj8 = UserInfo.objects.filter(password='123456',id__gt=2).exclude(phone=188)
#找到符合filter的内容后排除phone等于188的,它的另一种写法为
from django.db.models import Q
obj = UserInfo.objects.filter(Q(password='123456') & Q(id__gt=2) & ~Q(phone=188))

计算和和最大值:


from django.db.models import Sum,Max,Min
obj = UserInfo.objects.aggregate(Sum('id'))
obj = UserInfo.objects.aggregate(Max('id'))
obj = UserInfo.objects.aggregate(Min('id'))

统计个数


print(UserInfo.objects.count())#注:print只可于终端查看

范围查找


obj = UserInfo.objects.all()[1:3]#左闭右开,只查找了1和2

去重复


obj = person.useraddress_set.all()

而 get 方法与 filter 的最大区别为,get 只能返回一个数据,filter 可以返回多个,在 get 查找到两个以上数据时就会报错。


obj4 = UserInfo.objects.get(id=5)
city = UserAddress.objects.get(detail='北京望京')

以上这篇对 Django 项目中的 ORM 映射与模糊查询的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

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

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 算法库。