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')

上一篇:Redis系列-存储篇string主要操作函数小结


下一篇:C缩写