python自动化运维学习第二十二天--ORM高级

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)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值