Django 数据库操作
Django 数据库操作
Django运算表达式与Q对象/F对象
1 模型查询
概述:
1 查询集:表示从数据库中获取的对象的集合
2 查询集可以有多个过滤器,通过 逻辑运算符连接
3 过滤器就是一个函数,基于所给的参数限制查询的结果,类似MySQL模糊查询中where语句
4 查询集等同select语句
2 查询集
特点:
1 查询集通过调用过滤器方进行查询, 查询集经过过滤器筛选后返回新的查询集,可以链式调用
2 惰性执行 创建查询集不会带来任何数据库的访问直到调用数据库才会访问
返回单个数据查询:
get() 返回一个满足条件的对象
注意:没有找到符合条件的对象,模型类引发异常 模型类.DoesNotExists异常
如果找到多个对象也会引发异常 模型类.MultipleObjectsReturned
count() 返回查询集中的对象个数
first() 返回第一个查询集对象
last() 返回最后一个查询集对象
exists() 查询集是否有数据,如果有数据返回true
限制查询集:查询集返回的是列表,可以采用下标的方法进行限制,等同于sql中的limit语句
studentList = Student.objects.all()[0:5]
查询集缓存 : 每个查询集都包含一个缓存,来最小化的对数据库访问。在新建的查询集中,缓存首次为空,第一次对查询 集求值,django会将数据缓存,并返回结果,以后结果直接使用缓存集的数据
3 常见过滤器
all() 返回所有对象
filter() filter(键=值,键=值) 且关系
返回符合条件的数据
filter(键=值),filter(键=值)
exclude() 过滤掉符合条件数据
order_by() 排序
values() 一条数据就是是一个对象(字典),返回一个列表
4 比较运算符
(1)概述: 实现where语句,作为filter() exclude() get()的参数
语法: 属性名称__运算符 = 值
外键: 属性名_id
转义: 类似like语句,是为了匹配占位,匹配数据中的%,sql中where like '\%'
filter(sname__contains = '%')
(2)常见的比较运算符:
exact 判断,大小写敏感
filter(isDelete=False)
contains 是否包含,大小写敏感
stuList = Student.objects.filter(sname__contains ='孙' )
startswith 以value开头,大小写敏感
stuList = Student.objects.filter(sname__startswith ='孙' )
endwith 以value结尾,大小写敏感
in 是否包含在范围内 filter(pk__in=[2,4,6,8,10])
注: 以上四个前面加上i,就表示不区分大小写,iexact,icontains,istartswith,iendswith
(3) 其他形式查询
为空判断:
isnull ,isnotnull 是否为空 filter(sname__isnull=Flase)
比较运算:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
filter(sage_gt=30)年龄大于30
时间查询:
year/month/day/week_day/hour/minute/second filter(lastTime__year=2017)
跨关查询 处理join查询 模型类型__属性名__运算符(可选)
查询快捷 pk 代表的主键
5 F对象与Q对象
常见的聚合函数:
使用aggregate()函数返回聚合函数的值
Avg Count Max Min sum
from dango.db.models import Max
maxAge = Student.objects.aggregate(Max('sage')) 找出学生年龄最大的
F对象
1 可以使用模型的A属性与B属性进行比较
from django.db.models import F,Q
def grades(request):
g = Grades.objects.filter(ggirlnum_gt=F('gboynum')) 找到女生人输大于男生人数的班级
2 支持F对象的算术运算 filter(ggirlnum_gt=F('gboynum')+20)
3 F对象的参数可以是跨表字段
models.Book.objects.filter(bread_num=F(''author_name'))
4 F对象参数如果是date/time,可以进行日期的加减运算:
models.Book.objects.filter(bpub_date__lt=F('bpub_date') + timedelta(days=5))
Q对象
概述 过滤器的方法中的关键字参数,,条件为And模式,采用逻辑或引入Q对象
需求 进行or查询,或查询
解决 使用Q对象
Q对象可以使用&(and)、|(or)操作符组合起来
studentList = Student.objects.filter(Q(pk__lt = 3)|Q(sage__gt=50)) pk_id小于3或年龄大于50岁
models.User.objects.filter(Q(username='老王') & Q(userpass='admin')) 条件与组合
models.User.objects.filter(~Q(username='老王')) 条件非表示取反
可以使用 &(and) |(or) ~(not) 结合括号进行分组,构造更复杂的Q对象
filter函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and
下面分享一个综合用法:
def get(self, request, *args, **kwargs):
filters = request.GET
#找出符合customer的数据转成列表
Qs = [Q(customer=request.user.customer)]
try:
if 'limit' in filters:
limit = abs(int(filters['limit']))
if limit > 50:
limit = 50
else:
limit = 15
start_id = int(filters.get('start_id', 0))
#添加符合start_id的对象
Qs.append(Q(id__gt=start_id))
#添加符合状态的state
if 'state' in filters:
Qs.append(Q(state__in=filters['state']))
else:
Qs.append(Q(state__in=[0, 1, 2, 3, 4]))
#添加符合title的数据
if 'title' in filters:
Qs.append(Q(title__contains=filters['title']))
except Exception:
return params_error({"filters": "过滤参数不合法"})
#通过*Qs,对列表数据同时满足上述情况的数据进行总的帅选,并设置限制集
sets = Questionnaire.objects.filter(*Qs)[:limit]
Django 数据库操作的更多相关文章
- 从命令行运行django数据库操作
从命令行运行django数据库操作,报错: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_T ...
- Django数据库操作(增删改查)
Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...
- django数据库操作和中间件
数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...
- Django数据库操作
刚学到Django的数据库操作,把它记录下来,方便以后查看: 在Django中定义数据库表,并使用Django提供的方法来对数据库进行操作(增.删.改.查) 1.定义3个数据库表: class Gro ...
- 11.Django数据库操作(查)
django.db.models.query.QuerySet1.可迭代2.可切片 官方文档:https://docs.djangoproject.com/en/1.9/ref/models/quer ...
- django 数据库操作详解
Django配置使用mysql数据库 修改 settings.py 中的 DATABASES 注意:django框架不会自动帮我们生成mysql数据库,所以我们需要自己去创建. DATABASES ...
- Python Django 数据库操作
1. 建立app 在自己的工程项目目录下输入: python manage.py startapp myapp(你想建立的app名称) 建立一个叫myapp的app 这样,在你的工程项目目录下会出现一 ...
- Django 数据库操作进阶F和Q操作
Model中的F F 的操作通常的应用场景在于:公司对于每个员工,都涨500的工资.这个时候F就可以作为查询条件 1 2 3 from django.db.models import F models ...
- Python菜鸟之路:Django 数据库操作进阶F和Q操作
Model中的F F 的操作通常的应用场景在于:公司对于每个员工,都涨500的工资.这个时候F就可以作为查询条件 from django.db.models import F models.UserI ...
随机推荐
- 并发编程-Java内存模型
将之前看过的关于并发编程的东西总结记录一下,本文简单记录Java内存模型的相关知识. 1. 并发编程两个关键问题 并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步. (1)在命令式 ...
- [Javascirpt] What’s new in JavaScript (Google I/O ’19)
Private variable in class: class Counter { #count = 0; // cannot be access publicly get value () { r ...
- js中声明函数的区别
在JS中有两种定义函数的方式, 1是var aaa=function(){...} 2是function aaa(){...} var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,然后调用 ...
- Sogou for Linux
造冰箱的大熊猫,本文适用于Ubuntu 18.04@cnblogs 2019/5/8 在Ubuntu(安装时选择英文语言环境)下安装搜狗输入法 1)从搜狗官网下载sogou拼音输入法的deb安装包. ...
- CLOB、BLOB , CLOB与BLOB的区别
CLOB 定义 数据库中的一种保存文件所使用的类型. Character Large Object SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系.SQL CLOB 是内置类型,它将字 ...
- 2018-2019-2 网络对抗技术 20165205 Exp8 Web基础
2018-2019-2 网络对抗技术 20165205 Exp8 Web基础 1.原理与实践说明 1.1实践内容 Web前段HTML:能正常安装.启停Apache.理解HTML,理解表单,理解GET与 ...
- HearthBuddy Plugin编写遇到的问题
错误1 赋值问题 貌似编译器版本有点低,无法识别C#的高级语法糖 属性的初始值,必须是public bool IsEnabled { get{return true;} } 不能写成public bo ...
- ant DatePicker 中文
方式一:局部设置 import 'moment/locale/zh-cn'; import locale from 'antd/lib/date-picker/locale/zh_CN'; //调用时 ...
- np.repeat()
np.repeat()用于将numpy数组重复. numpy.repeat(a, repeats, axis=None); 参数: axis=0,沿着y轴复制,实际上增加了行数axis=1,沿着x轴复 ...
- Postman系列之发送请求(一)
实验简介 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.它能提供功能强大的 Web API 和 HTTP 请求的调试,它能够发送任何类型的HTTP 请求 (GET, ...