Django ORM 映射原理与模糊查询实战指南
本文深入解析 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 映射与模糊查询的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









