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
原文地址:https://www.cnblogs.com/40kuai/p/6952051.html