django_orm 基本操作
单表操作
1 增的操作:
2
3 一种方式:表名.objects.create(name='xxoo')
4
5 第二种方式:表名(name='xxoo')
6
7 obj=表名(name='xxoo')
8
9 obj.save()
10
11 第一种方式就是第二种方式的内部操作
12
13
14
15 查的操作:
16
17 获取所有:表名.objects.all()
18
19 条件获取:表名.objects.filter(name='xxoo') 表名.objects.filter(id=1) 表名.objects.filter(id=1,name='xxoo')
20
21 条件是大于1:表名.objects.filter(id__gt=1) 不能使用id>1,是因为传参数不能出现>的表达式,
22
23 只认等于号.
24
25 找到的结果:[obj(id,name),obj(id,name)]
26
27
28
29 只取第一个:objects.filter(id__gt=1).first()
30
31 找到的结果:[obj(id,name)]
32
33 神奇的双下划线:可以做跨表,也可以作为查找的条件筛选
34
英文全称:
1 -gt: (greater than) 大于
2 -ge: (greater than or equal) 大于或等于
3 -lt: (less than) 小于
4 -le: (less than or equal)小于或等于
5 -ne: (not equal) 不相等
6 -eq: (equal) 相等
7 -nq: (not equal) 不等于
1 删的操作:
2
3 表名.objects.filter(id=1).delete()
4
5 表名.objects.all().delete()
6
7
8
9 改的操作:
10
11 表名.objects.all().update(name='xxoo')
12
13 表名.objects.filter(id=1).update(name='xxoo')
14
一对多的数据操作
Classes班级表
id name
1 1班
2 2班
Students学生表
id username age gender cs_id
1 ago 12 男 1
1 增的操作:
2
3 第一种方式:
4
5 Student.objects.create(username='东北',age=18,gender='男',cs_id=1)
6
10
11 第二种方式:
12
13 Student.objects.create(username='东北',age=18,gender='男',cs=Classes.objects.filter(id=1).first())
14 15 cs代表的是Classes表拿到的一行数据 拿到的数据:[obj(id,name)]
16
17
18
19
20
21 查的操作:
22
23 例:只要是all(),filter()拿到的数据都是多行的数据,保存的时候都要用列表存起来
24
25 可以用来循环
26
27
28
29 ret=Student.objects.all()
30
31 for item in ret:
32
33 print(item.id)
34
35 print(item.name)
36
37 print(item.age)
38
39 print(item.gender)
40
41 print(item.cs_id)
42
43 在这里print(item.cs_id)找到的是外表的值value
44
45 在这里print(item.cs)找到的是外表的值的集合Queryset
46
47
48
49 所以能找到加了外键的外表的值:
50
51 print(item.cs.id)
52
53 print(item.cs.name)
54
55
56
57 删的操作:
58
59 Students.objects.filter(id=1).delete()
60
61 Students.objects.filter(cs_id=1).delete()
62
63
64
65 例1
66
67 cid=input('输入班级id')
68
69 Students.objects.filter(cs_id=cid).delete()
70
71 例2
72
73 cname=input('输入班级名称')
74
75 错误:Students.objects.filter(cs.name=cname).delete()会报错 cs.name就是等于cs__name
76
77 Students.objects.filter(cs__name=cname).delete() filter跨表操作,需要用双下划线,规定写法
78
多对多的数据操作:
Classes班级表
id name
1 1班
2 2班
class Classes(models.Model):
title=models.CharField(max_lenght=32)
m=models.Model.ManyToManyField('Teachers')第三张表操作
Teachers教师表
id name
1 ago
2 ago2
class Teachers(models.Model):
name=models.CharField(max_length=32)
增的操作:
obj= Classes.objects.filter(id=1).first() 先找到class表id=1的数据
obj.m.add(1) 操作第三张表
obj.m.add(2)
也可以传字典:obj.m.add([3,4])
C_T老师班级表
id 班级id 老师id
1 1 2
1 1 1
1 1 3
1 1 4
1 删的操作:
2 m=models.Model.ManyToManyField('Teachers')第三张表操作
3 obj.m.remove([1,2]) 只删除老师id=1和2的数据
4
5 obj.m.clear() 清空操作
6
7
8
9 重置操作:
10
11 obj.m.set([2,3,5]) 把这个班的老师id=4的数据删除,并自增id在最后一行增加一条老师id=5,set的就是最终的结果
12
13
14
15 查的操作:
16
17 例:把1班老师找出来
18
19 先把班找出来:obj=Classes.objects.filter(id=1).first()
20
21 obj.id
22
23 obj.title
24
25 ret = obj.m.all()目的是拿到老师的信息
26
27 ret是一个[老师obj(id,name),obj2(id,name)]
28
- 类代表一个数据库表
- 类的对象代指的是一行记录
- 外键字段代指关联表中的一行数据(类的对象)
- M2M字段,自动生成第三张表:依赖关联表对第三张表间接操作
需求:拿学生表的所有姓名
for这种方式是把所有的列都取了
stu_list=Students.objects.all()
for row in stu_list:
print(row.id,row.username)
取到的结果是对象的形式[obj,obj,obj,obj]
加上values就是取单列数据(字典的形式)
stu_list=Students.objects.all().values('id','username')
取到的结果是字典的形式:[{'id':1,'username':'xxoo'},{'id','username'}]
values_list(列表的形式)
stu_list=Students.objects.all().values_list('id','username')
取到的结果是列表的形式:[(1,'xxoo'),('id','username')]
需求:
找到1班的所有学生,跨表操作,取到所有数据
stu_list=Students.objects.filter(cs__name='1班')
找到1班的所有学生的姓名和所在班级,取到单列数据
stu_list=Students.objects.all().values('username',"cs_name") filter可以跨表.values也可以跨表
返回字典的形式,不用row.id,row.username
for row in stu_list:
print(row['username'],row['cs__name'])
正向查找与反向查找
假设有三个表,一个学校表,一个班级表,一个学生表
class School(models.Model):
name=models.CharField(max_length=32)
class Classes(models.Model):
title=models.CharField(max_length=32)
fk=models.ForeignKey(School)
Class Student(models.Model):
username=models.CharField(max_length=32)
age=models.InterField()
gender=models.BooleanField()
cs=models.ForeignKey(Classes)
如果要找到学生所在的班级及学校 表里面由foreignkey字段,叫做正向查找
推荐用正向查找
stu_list=Students.objects.all().values('username','cs__title','cs__fk__name')
这是由学生表.values去取到班级表跟学校表的内容
如果要由班级表去找到班级所在的学生,如果表里面没有foreignkey字段,叫做反向查找
一般不会进行此操作
Class Student(models.Model):
username=models.CharField(max_length=32)
age=models.InterField()
gender=models.BooleanField()
cs=models.ForeignKey(Classes,related_name='s')
也可以设定related_name='s'替代students_set,
要去关联的话,可使用隐藏的字段,[表名(类名)]的首个字母小写加上_set:
obj.student_set
obj=models.Classes.objects.filter(title='1班').first()
obj.students_set.all().username,age,gender,cs
obj.s.all()
谁是主表?
models.Students.objects.all().values('usernma','cs__title')
models.Classes.objects.all().values('title','s__username')
django_orm 基本操作的更多相关文章
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- 三、Redis基本操作——List
小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...
- 二、Redis基本操作——String(实战篇)
小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...
- 一、Redis基本操作——String(原理篇)
小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...
- Linq查询基本操作
摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...
- C++ map的基本操作和使用
原文地址:http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可 ...
- python之最强王者(10)———文件(File)、输入输出的基本操作
1. Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 2.打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式. ...
随机推荐
- redis复制+Sentinel搭建
1:实验环境 测试环境两台: master:172.16.16.34 slave:172.16.16.35 redis版本:redis3.2 要搭建的环境是,redis简单主从复制 2:安装redis ...
- wcf 配置与代码创建
<behaviors> <serviceBehaviors> <behavior name="MyServiceBehavior"> <s ...
- Useful WCF Behaviors - IErrorHandler
Behaviors in WCF are so stinking useful, and once you get past the basics of WCF they're arguably a ...
- skype for business server2015部署向导启动服务失败
命令行执行start-cspool失败 解决: 1.cmd执行servers.msc打开服务列表,将所有skype服务启动,默认是延迟启动 2.用管理员权限打开cmd,而不是普通权限 重新执行启动服务 ...
- TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等
本课主题 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...
- Docker的安装及加速
使用 yum 安装(CentOS 7下) Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname ...
- 来自Google资深工程师的API设计最佳实践
来自Google资深工程师Joshua Bloch的分享:API设计最佳实践 为什么API设计如此重要?API是一个公司最重要的资产. 为什么API的设计对程序员如此重要? API一旦发布,出于兼容性 ...
- 高CPU业务
高CPU业务 Gearman是当年LiveJournal用来做图片resize的,大家也明白图片resize是一个高CPU的操作,如果让web网站去做这个高CPU的功能,有可能会拖垮你的 web应用, ...
- hdu-2841 Visible Trees---容斥定理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2841 题目大意: N*M的格点上有树,从0,0点可以看到多少棵树. 解题思路: 发现如果A1/B1= ...
- Junit应用代码(读取mysql表数据)
1. 封装连接数据库的类: import java.sql.ResultSet; import java.sql.Connection; import java.sql.DriverManager; ...