zoukankan      html  css  js  c++  java
  • Django中数据查询(万能下换线,聚合,F,Q)

    数据查询中万能的下划线基本用法:

             __contains: 包含
             __icontains: 包含(忽略大小写)
             __startswith: 以什么开头
             __istartswith: 以什么开头(忽略大小写)
             __endswith
             __iendswith
             __gt: 大于
             __gte: 大于等于
             __lt: 小于
             __lte: 小于等于
             __rang: 范围
                       models.Book.objects.filter(pub_date__range=('2015-01-01','2016-01-01'))
             __isnull: 判断是否为空
             __regex: 正则匹配
                       Entry.objects.get(title_regex=r'^(An|The) +')
             __regex: 不区分大小写的正则匹配
                       Entry.objects.get(title_regex=r'^(an|the) +')
    models.Book.objects.exclude(price=None):反查询

    聚合:

             from django.db.models import Avg,Max,Mix,Sum,Count
             Book.objects.all().aggregate(Avg('price')
             models.Book.objects.values('publisher__name').annotate(Count('id'))
             models.Book.objects.values('publisher__name').annotate(Avg('price'))
             models.Book.objects.filter(name_contains='J',pub_date__year='2016')
    

    Q 语句:

             默认是AND

             >>> from django.db.models import Q

             >>> Q(put_date__year = '2016')

             <Q: (AND: ('put_date__year', '2016'))>

            

             AND

             >>> Q(put_date__year =2016) , Q(put_date__year=2018)

             (<Q: (AND: ('put_date__year', 2016))>, <Q: (AND: ('put_date__year', 2018))>)

            

             加个| 为or的意思

             >>> Q(put_date__year =2016)|Q(put_date__year=2018)

             <Q: (OR: ('put_date__year', 2016), ('put_date__year', 2018))>

            

             ~ 为取非

             >>> Q(put_date__year =2016)| ~ Q(put_date__year=2018)

             <Q: (OR: ('put_date__year', 2016), (NOT (AND: ('put_date__year', 2018))))>

            

             AND和OR

             >>> Q(put_date__year =2016) , Q(put_date__year=2018)| Q(put_date__year=2019)

             (<Q: (AND: ('put_date__year', 2016))>, <Q: (OR: ('put_date__year', 2018), ('put_date__year', 2019))>)

            

             在生成条件语句后利用filter来进行查询

             q = Q(put_date__year =2016)|Q(put_date__year=2018)

             models.Book.objects.filter(q)

       

    from django.db.models import Q    # 导入Q
    con = Q()   # 创建Q对象
    
    q1 = Q()    
    q1.connector = 'OR'      # q1的元素为OR或的关系
    q1.children.append(('id', 1))
    q1.children.append(('id', 10))
    q1.children.append(('id', 9))
    
    q2 = Q()
    q2.connector = 'OR'      # q2的元素为OR或的关系
    q2.children.append(('c1', 1))
    q2.children.append(('c1', 10))
    q2.children.append(('c1', 9))
    
    con.add(q1, 'AND')      # 将q1添加到con对象中,与其他的Q为且的关系
    con.add(q2, 'AND')
    
    models.Tb1.objects.filter(con)   #将总的Q对象添加到model的查找条件中
    

      

    F 语句:

            

             自修改

             本表内两个字段比较

             字段数据迁移

            

             from django.db.models impport F

            

             1.先查看所有的商品价格

             models.Book.objects.values('price')

             2.所有商品价格+10

             models.Book.objects.update(price=F('price')+10)

            

             # 本表内两个字段比较

             models.Book.objects.filter(num1__get= F('num2'))  # 仅仅为例子

            

             # 表内字段数据迁移

             1.memo字段默认为空,把memo字段设为为同表中的name字段的值

             models.Book.objects.update(memo=F('name'))

             2.models.Book.objects.values('memo,name')

            

             

    最新内容可以看我的blog: 40kuai
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/40kuai/p/6952051.html
Copyright © 2011-2022 走看看