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 方法外,最常见的就是 allfilterexclude 方法了。这里做了表格化的总结:

  1. all 方法

    公式 备注
    数据表名.objects.all() 查询所有
    数据表名.objects.all()[:10] 切片 (前10条)
    数据表名.objects.all().reverse()[:2] 反向切片 (最后两条)
    数据表名.objects.all().reverse()[0] 最后一条
  2. 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检索
  3. exclude方法

    exclude 的用法和 filter 基本相同,此处省略。

Django的链式查询

  1. 两种参数形成链式查询

    公式 备注
    数据表名.objects.filter(字段名__year__gte=年份数字) 日期时间查询支持串接比较参数
  2. 两种方法形成链式查询

    公式 备注
    数据表名.objects.filter(字段1__contains=”查询1“).exclude(字段2=”查询2“) 链式查询(支持多个 filter/exclude串接)

参考文献

  1. 涂伟忠.Django QuerySet API[EB/OL].https://code.ziqiangxuetang.com/django, 2022/02/12.
  2. 涂伟忠.Django QuerySet 进阶[EB/OL].https://code.ziqiangxuetang.com/django, 2022/02/12.
  3. 菜鸟教程.Django 模型[EB/OL].https://www.runoob.com/django/django-model.html, 2022/02/12.
  4. Django Software Foundation.QuerySet API reference[EB/OL].https://docs.djangoproject.com/en/dev/ref/models/querysets/, 2022/02/12.
  5. Django Software Foundation.Model field reference[EB/OL].https://docs.djangoproject.com/en/2.2/ref/models/fields/, 2022/02/12.