Object Relational Mapping(关系对象映射),简称为 ORM;对于 Django 框架,指的是Django通过内部的处理函数,实现了多种数据库统一的访问方法,从而可以非常方便地实现软件系统的开发,无须针对不同的数据库进行 SQL 语句的编写;对于非职业开发人员而言,这是一种非常大的优势。
在开发中小型网站时,使用 Django 确实能够带来了很多的方便。
Django orm 用法概述
在 ORM 中,查询是更新、删除的基础,查询到相应的QuerySet对象后,可以执行特定字段的设值或者删除操作,如下:
| 项目 | 示例 | 备注 |
|---|---|---|
| 查询 | test1 = Test.objects.get(id=1) | 数据表名=TEST,字段名= id |
| 更新 | test1.name = ‘Google’ test1.save() |
name 为`字段名 |
| 删除 | test1.delete() |
Django 的 filter、exclude
Django的查询方法有很多,基本公式是 数据库名.object.ORM访问方法(字段名__字段控制参数=查询条件) 。
除了 get 方法外,最常见的就是 all、filter、exclude 方法了。这里做了表格化的总结:
all 方法
公式 备注 数据表名.objects.all()查询所有 数据表名.objects.all()[:10]切片 (前10条) 数据表名.objects.all().reverse()[:2]反向切片 (最后两条) 数据表名.objects.all().reverse()[0]最后一条 filter 方法
公式 备注 数据表名.objects.filter(字段名=”查询内容“)数据表名.objects.filter(字段名=”查询内容“)数据表名.objects.filter(字段名__exact=”查询内容“)数据表名.objects.filter(字段名__iexact=”查询内容“)精确查询( i开头,表示不区分大小写,下同)数据表名.objects.filter(字段名__contains=”查询内容“)数据表名.objects.filter(字段名__icontains=”查询内容“)包含文本 数据表名.objects.filter(字段名__in=[“查询1“, “查询2“,…, “查询n“ ])范围检索(任1) 数据表名.objects.filter(字段名__range=(最小值,最大值))数字区域检索__range=(‘2005-01-01 00:00:00’, ‘2005-03-31 00:00:00’)数据表名.objects.filter(字段名__gt=查询数字)数据表名.objects.filter(字段名__gte=查询数字)数据表名.objects.filter(字段名__lt=查询数字)数据表名.objects.filter(字段名__lte=查询数字)数值比较(支持与日期/时间参数串接) 数据表名.objects.filter(字段名__date=’YYYY-mm-dd‘)数据表名.objects.filter(字段名__year=年份数字)数据表名.objects.filter(字段名__iso_year=年份数字)数据表名.objects.filter(字段名__month=月份数值)数据表名.objects.filter(字段名__day=日数值)数据表名.objects.filter(字段名__week=周数)
数据表名.objects.filter(字段名__week_day=星期几数) # 星期日=1数据表名.objects.filter(字段名__iso_week_day=星期几数) # 星期一=1数据表名.objects.filter(字段名__quarter=季节数) # 新历数据表名.objects.filter(字段名__time=”HH:MM“)数据表名.objects.filter(字段名__hour=小时数)数据表名.objects.filter(字段名__minute=分钟数)数据表名.objects.filter(字段名__second=秒数)数据表名.objects.filter(字段名__date=’2022-01-00’)数据表名.objects.filter(字段名__year=2022)数据表名.objects.filter(字段名__iso_year=2022)数据表名.objects.filter(字段名__month=2)数据表名.objects.filter(字段名__day=10)数据表名.objects.filter(字段名__week=52)数据表名.objects.filter(字段名__week_day=1)数据表名.objects.filter(字段名__iso_week_day=1)数据表名.objects.filter(字段名__quarter=2)数据表名.objects.filter(字段名__time=datetime.time(14, 30))数据表名.objects.filter(字段名__hour=22)数据表名.objects.filter(字段名__minute=59)数据表名.objects.filter(字段名__second=59)数据表名.objects.filter(字段名__startswith=”查询内容“)数据表名.objects.filter(字段名__istartswith=”查询内容“)数据表名.objects.filter(字段名__endswith=”查询内容“)数据表名.objects.filter(字段名__iendswith=”查询内容“)匹配开头/结尾检索 数据表名.objects.filter(字段名__regex=”查询内容“)数据表名.objects.filter(字段名__iregex=”查询内容“)正则表达式查询 数据表名.objects.filter(字段名__isnull=布尔值)数据 null检索exclude方法
exclude 的用法和 filter 基本相同,此处省略。
Django的链式查询
两种参数形成链式查询
公式 备注 数据表名.objects.filter(字段名__year__gte=年份数字)日期时间查询支持串接比较参数 两种方法形成链式查询
公式 备注 数据表名.objects.filter(字段1__contains=”查询1“).exclude(字段2=”查询2“)链式查询(支持多个 filter/exclude串接)
参考文献
- 涂伟忠.Django QuerySet API[EB/OL].https://code.ziqiangxuetang.com/django, 2022/02/12.
- 涂伟忠.Django QuerySet 进阶[EB/OL].https://code.ziqiangxuetang.com/django, 2022/02/12.
- 菜鸟教程.Django 模型[EB/OL].https://www.runoob.com/django/django-model.html, 2022/02/12.
- Django Software Foundation.QuerySet API reference[EB/OL].https://docs.djangoproject.com/en/dev/ref/models/querysets/, 2022/02/12.
- Django Software Foundation.Model field reference[EB/OL].https://docs.djangoproject.com/en/2.2/ref/models/fields/, 2022/02/12.
最后更新: 2022/02/12 12:44:10
编者: David Faraday
主用链接: https://faradays-studio.gitee.io/202202121135/
备用链接: https://faradays-studio.github.io/202202121135/
引用、演绎等请注明出处,共创和谐社会,谢谢你的合作!