ORM中的高级条件操作与惰性机制

双下划线(__)之单表条件查询:
例如我们查询用户表里面的数据

# 获取id大于0 且 小于5的值
obj_li = models.Userinfo.objects.filter(id__lt=5,id__gt=0)   
# 获取id等于2,3的数据
l = [2,3]
obj_li = models.Userinfo.objects.filter(id__in = l)  
# not in
obj_li = models.Userinfo.objects.exclude(id__in = l)  
#name字段中,内容中包含 ven的都匹配出来
obj_li = models.Userinfo.objects.filter(name__contains = 'ven')
# icontains大小写不敏感
obj_li = models.Userinfo.objects.filter(name__icontains="ven") 
# 范围bettwen and
obj_li = models.Userinfo.objects.filter(id__range=[1, 2])   
#name 字段中以do 开头
obj_li = models.Userinfo.objects.filter(name__startswith='do')

obj_li = models.Userinfo.objects.filter())
#    startswith,istartswith, endswith, iendswith,

我们得到的是一个list,将其循环读出遍可以了

for item in obj_li:
    print (item)

QuerySet与惰性机制
所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。

QuerySet特点:
<1> 可迭代的
<2> 可切片
示例:
获取全部值是:
docker234
linux235
多对多测试123
网络
当我们切片的时候,(跟list切片一样)

def list(request):
    obj_li = models.Userinfo.objects.all()
    for item in obj_li[1:3]:
        print (item.name)

控制台输出:
linux235
多对多测试123

F查询和Q查询
仅仅靠单一的关键字参数查询已经很难满足查询要求。此时Django为我们提供了F和Q查询:

F查询:
就这样一条简单的语句就完成了对表中所有商品价格的更新,是不是很方便!如果没有F查询,你首先要获取原价格,再做一个算术运算,然后更新字段。F查询专门对对象中某列值的操作,不可使用__双下划线!

def list(request):
    from django.db.models import F
    # 对于book表中每本书的价格都在原价格的基础上增加20元
    Book.objects.update(price=F("price")+20)  

Q查询:
Q查询可以组合使用 “&”, “|” 操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象,Q对象可以用 “~” 操作符放在前面表示否定,也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

查询username 为li开头 或者以o结尾的用户。

from django.db.models import Q
obj_li = models.Userinfo.objects.filter(Q(username__startswith='li') |Q(username__endswith='o'))
for item in obj_li:
    print (item.username)

输出:
liaochao
xiaochao
lifanli

其他条件也是类似的:
查询username 为li开头 并且以o结尾的用户

obj_li = models.Userinfo.objects.filter(Q(username__startswith='li') &Q(username__endswith='o'))
1
查询username 不已为li开头 并且不已o结尾的用户

obj_li = models.Userinfo.objects.filter(~Q(username__startswith='li') &~Q(username__endswith='o'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值