ORM查询双下划线和条件查询
直接上例子
---------------双下划线(__)单表条件查询----------------
obj_list = models.UserInfo.objects.filter(id__lt=5, id__gt=1) # 获取id大于1且小于5的值
for i in obj_list:
print(i.name)
models.UserInfo.objects.filter(id__in=[1, 2, 3]) # 获取id等于1、2、3的数据
models.UserInfo.objects.exclude(id__in=[1, 2, 3]) # 不在列表中的,not in
models.UserInfo.objects.filter(username__contains="ven") # 包含
models.UserInfo.objects.filter(username__icontains="ven") # 忽略大小写包含
models.UserInfo.objects.filter(id__range=[1, 2]) # 范围between and
models.UserInfo.objects.filter(username__startswith="zh") # 以zh开头的
models.UserInfo.objects.filter(username__istartswith="zh") # 忽略大小写的以zh开头的
models.UserInfo.objects.filter(username__endswith="zh") # 以zh结尾的
models.UserInfo.objects.filter(username__iendswith="zh") #忽略大小写以zh结尾的
ORM惰性机制
所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。
QuerySet可迭代、可切片
obj_list = models.UserInfo.objects.all()
for i in obj_list[1:4]: #去obj_list这个结果集的第二个到第四个值
print(i.name)
F和Q查询
F查询的适用场景是,单独对某列修改。比如过了一年,所有学生年龄都要加1,可以使用F查询一行代码就可以实现。
# F 使用查询条件的值,专门取对象中某列值的操作
from django.db.models import F #要导入F模块
models.UserInfo.objects.update(num=F('num')+1) #对num列统一加1,如果不是int类型会直接修改为1
F查询主要适用于数字类型,Q查询是适用比较广泛,可以对查询设置多个条件
from django.db.models import Q #导入Q模块
#1 Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询
q1=models.Book.objects.filter(Q(title__startswith='P')).all() #title开头是P的所有对象
print(q1) #会输出像[<Book: Python>, <Book: Perl>]
# 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
Q(title__startswith='P') | Q(title__startswith='J') #“|”表示或关系,“&”和“,”表示与关系
# 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
Q(title__startswith='P') | ~Q(pub_date__year=2005) #“~”表示取反
# 4、应用范围:
# Each lookup function that takes keyword-arguments (e.g. filter(),
# exclude(), get()) can also be passed one or more Q objects as
# positional (not-named) arguments. If you provide multiple Q object
# arguments to a lookup function, the arguments will be “AND”ed
# together. For example:
models.Book.objects.filter(
Q(title__startswith='P'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
#类似sql:
# SELECT * from polls WHERE question LIKE 'P%'
# AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
# import datetime
# e=datetime.date(2005,5,6) #2005-05-06
# 5、Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
# 正确:
models.Book.objects.filter(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
title__startswith='P')
# 错误:
models.Book.objects.filter(
question__startswith='P',
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))