设为首页 加入收藏

TOP

Django之ORM(三)
2018-11-14 18:12:15 】 浏览:233
Tags:Django ORM

* id__lt=3 表示id小于3

* id__gt=1 表示id大于1

* id__in=[1, 2, 3] 表示id在列表中

* name__contains="fenc" 表示name中包含fenc

* name__icontains="ven" 表示不区分大小写的包含

* id__range=[1,3] 表示id在1到3之间,包括1,3

* name__startswith='cs' 表示以cs开头的

* name__endswith='cs' 表示以cs结尾的

* name__istartswith  不区分大小写

* name__iendswith 不区分大小写

* 等等

 

######5.聚合查询aggregate

聚合查询是对QuerySet对象进行计算得到一个结果值作为字典中的值放到一个字典中

这里先引入一些聚合方法

```python

from django.db.models import Avg,Min,Sum,Max

```

举例:

```python

result=student.objects.all().aggregate(Max('num'))
print(result)

```

得到的是一个字典:{'num__max': 3}

若你想给这个字典的key换一个名字,可以使用:

```python

result=student.objects.all().aggregate(new_name=Max('num'))

```

输出:{'new_name': 3}

也可以同时进行多个聚合查询

```python

result=student.objects.all().aggregate(Avg('num'),Min('num'),new_name=Max('num'))

```

######6.分组查询annotate

分组查询就像是SQL语句中的group by

可以如下使用,即以school_id分组,计算每组的max(num)

```python

result=student.objects.values('school_id').annotate(Max('num'))

```

也可以对QuerySet对象使用

在查询得出的结果集中进行分组

```python

result=student.objects.filter(school_id__lt=2).values('school_id').annotate(Max('num'))

```

######7.F查询

执行F查询前还得先引入

```python

from django.db.models import F

```

F查询可以将对象中的值作为变量使用,例如:

```python

result=student.objects.filter(id__gt=F('school_id'))

```

或者

```python

result=student.objects.update(num=F('school_id')+1)

```

######8.Q查询

惯例先引入

```python

  from django.db.models import Q

```

Q查询是应用在查询条件上的。

在普通的查询当中,且可以用逗号‘,’表示,可是如果我们想使用或的关系怎么办,使用Q来完成它

```python

student1=student.objects.filter(Q(num=1) | Q(school_id=1))

```

相当于用Q将条件封装,在Q对象之间使用&或者|或者~

如果想将普通发关键字参数查询与Q查询一起使用,必须将关键字参数查询放到Q的后边

######9.扩展查询extra

Django 的查询语法难以简练地表达复杂的 WHERE 子句,于是使用扩展查询extra,其原理相当于给SQL语句中添加子语句

extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)

这些参数都是可写可不写的

简单举例:

直接暴力上中文了

```python

student1=student.objects.extra(select={'是否大于2':'num>2'})
print(student1.values('是否大于2')[0]['是否大于2'])

```

SQL语句其实执行的是SELECT (num>2) AS `是否大于2` FROM `blog_student

可以为select传递参数

```python

student1=student.objects.extra(select=({'是否大于2':'num>%s'}),select_params = ('2',))

```

可以排序

加‘-’为从大到小,不加为从小到大

```python

student1=student.objects.extra(select=({'是否大于2':'num>%s'}),select_params = ('2',))
student1=student1.extra(order_by=['-是否大于2'])

```

语句中会添加SELECT (num>'2') AS `是否大于2` FROM `blog_student` ORDER BY `是否大于2` DESC

也可以设置where条件,并且给where设置参数

```python

student1=student.objects.extra(select=({'是否大于2':'num>%s'}),select_params = ('2',),where=['id<%s'],params=['4'])

```

 SQL语句为SELECT (num>'2') AS `是否大于2` FROM `blog_student` WHERE (id<'4') ORDER BY `是否大于2` DESC

######10.日志查看对应执行的SQL语句

在setting.py中加上下边的代码

```python

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}

LOGGING

```

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇django配置发送邮箱 下一篇python+scrapy环境搭建步骤描述

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目