django_view操作数据库
1 create
def add_area(request):
area = Area.objects.create(name='commom',description='a commom area',manager='vicuic')
return HttpResponse('added successfully')
#具体的实现上,一般是web端使用post传递参数,然后再输入数据库,这里为了简便,所以直接设定值
2 select
什么是查询集?QuerySet
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
2.查询集特性:
一:惰性执行
创建all()等过滤方法时,数据库并不会进行实际查询
只有当真正使用时,如遍历的时候,才会真正去数据库进行查询
二:缓存
Django是动态网站,每次请求都会数据库中进行相应的操作。当访问量很大时,耗时就会增加。
缓存将某个views的返回值保存至内存或者memcache中,在设置的时间内,再有访问过来时,就不再执行view中的操作,而是直接从缓存中取值
缓存机制:每次有请求进来,先去看缓存是否有,有且未过期,直接拿值
如果缓存没有或者已过期,就要走视图,走数据库
def list_area(request):
areas = Area.objects.all()
#返回带所有结果的查询集
blog_list = BlogPost.objects.all().order_by('-timestamp')
#返回所有结果的查询集,查询结果按照时间戳降序排列
#去掉-为升序
lines = models.UserInfo.objects.filter(username='jab',pwd='123123')
#返回filter过滤的查询集
ret = list(config.objects.filter(id=id).values('dir'))[0]
#objexts这个对象使用filter,返回查询集,然后values方法表示只要dir字段
#对查询集使用列表转换,然后取第一个数据
get()和filter()的区别:
get()返回的是一个models实例,如果没有get到则会抛出异常。
filter()返回的是查询集,相当于列表,如果没有fiter到,就返回{}。
如果只有一个匹配结果:
filter().fitst() = get()
filter()[0] = get()
values(*fields)
返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象。
values() 接收可选的位置参数*fields,它指定SELECT 应该限制哪些字段。如果指定字段,每个字典将只包含指定的字段的键/值。如果没有指定字段,每个字典将包含数据库表中所有字段的键和值。
因为ManyToManyField
字段和反向关联可能有多个关联的行,包含它们可能导致结果集的倍数放大。如果你在values()
查询中包含多个这样的字段将更加明显,这种情况下将返回所有可能的组合。
user和roles是M2M, roles和perm也是M2M
这里就是查询一个user关联的所有roles,所关联的perm不是空的查询集。
为避免重复性,加入distinct() permission_menu_list = user.roles.filter(permissions__isnull=False).distinct().values(
'permissions__title',
'permissions__url',
'permissions__name',
'permissions__menu_id', # 菜单相关
'permissions__menu__title',
'permissions__menu__icon',
'permissions__parent_id', # 父权限相关
'permissions__parent__name'
)
参考:
https://www.cnblogs.com/rgxx/p/10382664.html
3 update
def update_area(request):
user = User.objects.get(username='vici')
Area.objects.filter(name='lovely').update(manager=user)
return HttpResponse('updated!')
#Area的manager字段为User的外键,先获取特定的User行赋值给user,然后在Area的行中做行更新。
#user是一个class,这里用get获取,才能将user作为外键赋值给manager
#如果用filter则返回一个查询集。无法赋值
4 delete
def delete_area(request):
# Area.objects.filter(name='lovely').delete()
User.objects.filter(username='vici').delete()
return HttpResponse('deleted!')
#由于Area的manager是User的外键,并且设置了级联删除,所以,当删除User中的一条数据,Area中引用这条数据的行都被删除了
django_view操作数据库的更多相关文章
- Java-jdbc操作数据库
如果需要访问数据库,首先要加载数据库驱动,数据库驱动只需在第一次访问数据库时加载一次.然后在每次访问数据库时创建一个Connection实例,获取数据连接,这样就可以执行操作数据库的SQL语句.最后在 ...
- python高级之操作数据库
python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...
- greenDao:操作数据库的开源框架
greenDAO: Android ORM for your SQLite database 1. greenDao库获取 英文标题借鉴的是greendrobot官网介绍greenDao时给出的Tit ...
- 总结一些关于操作数据库是sql语句还是存储过程问题
总结一些关于操作数据库是sql语句还是存储过程问题 程序中,你跟数据的交互,需要向数据库拿数据.更改数据库的数据等,这些操作,本身不是程序完成的,而是程序发命令给数据库去做的,不管是通过sql语句方式 ...
- greendao操作数据库的使用方法
第一步:把greendao-1.3.0-beta-1,greendao-generator-1.3.1两个jar包加载到工程的lib的文件夹中,一定要右键点击Add As Library后才能使用. ...
- pymysql 操作数据库
一.简介 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同,但目前pymysql支持python3.x而后者不支持3.x版本 其执行语句与sql源码相似 二.使用 ...
- Asp.Net MVC 自定义的MVC框架(非EF操作数据库)
一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受.半年时间算是我人生以来遇到过的最困苦的时候.理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕 ...
- 一次莽撞的行为:在phpmyadmin中修改MySQL root密码后无法操作数据库
一.手贱行为(✿◡‿◡) 在一次开发中通过xampp方式安装了PHP环境,需要操作数据库时通过phpmyadmin访问MySQL,在一次数据库操作时想起没有设置密码,于是直接在mysql数据库中的us ...
- python操作数据库
一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的l ...
随机推荐
- ORACLE 表空间扩展
最近公司在对即将上线的系统做数据迁移和压力测试,于是乎需要和 Oracle 经常的打交道.今天正好碰到了表空间的问题,记录下来以后备用.也是最近才学习到的,原来 Oracle 表空间也是有大小限制的, ...
- Gym - 100187J J - Deck Shuffling —— dfs
题目链接:http://codeforces.com/gym/100187/problem/J 题目链接:问通过洗牌器,能否将编号为x的牌子转移到第一个位置? 根据 洗牌器,我们可以知道原本在第i位置 ...
- codeforces 466A. Cheap Travel 解题报告
题目链接:http://codeforces.com/problemset/problem/466/A 题目意思:一个 ride 需要 a 卢布,m 个 ride 需要 b 卢布,这两种方案都可以无限 ...
- PowerDesigner 把Comment写到name中 和把name写到Comment中
在使用PowerDesigner对数据库进行概念模型和物理模型设计时,一般在NAME或Comment中写中文,在Code中写英文.Name用来显 示,Code在代码中使用,但Comment中的文字会保 ...
- Mutual information and Normalized Mutual information 互信息和标准化互信息
实验室最近用到nmi( Normalized Mutual information )评价聚类效果,在网上找了一下这个算法的实现,发现满意的不多. 浙江大学蔡登教授有一个,http://www.zju ...
- MTK OTG 流程
一.注册mt_usb驱动 kernel-3.18/drivers/misc/mediatek/usb20/mt6735/usb20.c static int __init usb20_init(voi ...
- FFmpeg在Linux下搭建 ***
今天介绍下FFmpeg在Linux下安装编译过程,总体过程比较顺利,就是在ffmpeg等的时间稍长点,仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采 ...
- ABP 框架启程 及 ABP 翻译目录及传送门
准备动手写一套电商的系统,辗转收集了不少相关的开源项目,最后决定使用ABP作为起点. 在园子里好多人都在推广ABP.有个园友做了一个集合贴,方便大家使用 ABP集合贴 建议大家优先看 HK Zhan ...
- vue 使用scss报错
vue-cli默认没有scss-loader,需要安装依赖:sass-loader node-sass 安装之后重启就可以使用: <style lang="scss"> ...
- JVM 内存区域
JVM 将内存区域划分为: Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟机栈, ...