4.3 模型查询

查询集

在管理器上调用过滤器方法会返回查询集,查询集表示从数据库中获取的对象集合

查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤

惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库

何时对查询集求值:迭代,序列化,与if合用

返回查询集的方法,称为过滤器

  • all()
  • filter()
  • exclude()
  • order_by()
  • values():一个对象构成一个字典,然后构成一个列表返回

  • 写法:

filter(键1=值1,键2=值2) 等价于 filter(键1=值1).filter(键2=值2)

  • 返回单个值的方法 get():返回单个满足条件的对象 如果未找到会引发"模型类.DoesNotExist"异常 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常 count():返回当前查询的总条数 first():返回第一个对象 last():返回最后一个对象 exists():判断查询集中是否有数据,如果有则返回True

1. 限制查询集

  • 查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和offset子句

  • 注意:不支持负数索引

  • 使用下标后返回一个新的查询集,不会立即执行查询

  • 如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()引发DoesNotExist异常

#这会返回前5个对象 LIMIT 5
Entry.objects.all()[:5]
#这将返回第六个到第十个对象 OFFSET 5 LIMIT 5
Entry.objects.all()[5:10]

字段查询

  • 实现where子名,作为方法filter()、exclude()、get()的参数
  • 语法:属性名称__比较运算符=值
  • 表示两个下划线,左侧是属性名称,右侧是比较类型
  • 对于外键,使用“属性名_id”表示外键的原始值
  • 转义:like语句中使用了%与,匹配数据中的%与,在过滤器中直接写,例如:filter(title__contains="%")=>where title like '%\%%',表示查找标题中包含%的

2. 比较运算符

exact:表示判等,大小写敏感;如果没有写“ 比较运算符”,表示判等

filter(isDelete=False)

contains:是否包含,大小写敏感

exclude(btitle__contains='传')

startswith、endswith:以value开头或结尾,大小写敏感

exclude(btitle__endswith='传')

isnull、isnotnull:是否为null

filter(btitle__isnull=False)

在前面加个i表示不区分大小写,如iexact、icontains、istarswith、iendswith

in:是否包含在范围内

filter(pk__in=[1, 2, 3, 4, 5])

gt、gte、lt、lte:大于、大于等于、小于、小于等于

filter(id__gt=3)

year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算

filter(bpub_date__year=1980)
filter(bpub_date__gt=date(1980, 12, 31))

用Q对象进行复杂查找

关键字参数查询 - 输入filter()等 - 是“AND”编辑在一起的。如果您需要执行更复杂的查询(例如,带有OR语句的查询),则可以使用。Qobjects

例如 查询or“或”的对象

# Q对象 

from django.db.models import Q

ob = Goods.objects.filter(Q(id__contains=v)|Q(title__contains=v))

其它查询方案:

# 模型提供 extra
ob = Types.objects.extra(select = {'paths':'concat(path,id)'}).order_by('paths')
#等同于
select *,concat(path,id) as paths from types order by paths;
Copyright © shxdledu.cn 2018 all right reserved,powered by Gitbook该文件修订时间: 2019-03-18 09:24:17

results matching ""

    No results matching ""