单表操作

  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
  1. 类代表一个数据库表

  2. 类的对象代指的是一行记录
  3. 外键字段代指关联表中的一行数据(类的对象)
  4. 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 基本操作的更多相关文章

  1. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  2. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  3. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  4. 三、Redis基本操作——List

    小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...

  5. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  6. 一、Redis基本操作——String(原理篇)

    小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...

  7. Linq查询基本操作

    摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...

  8. C++ map的基本操作和使用

    原文地址:http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可 ...

  9. python之最强王者(10)———文件(File)、输入输出的基本操作

    1. Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 2.打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式. ...

随机推荐

  1. Exchange 2016系统要求

    一.支持的共存方案 下表列出了一些支持 Exchange 2016 与 Exchange 早期版本共存的应用场景. Exchange 2016与Exchange Server早期版本共存 Exchan ...

  2. Oracle Fusion Middleware Supported System check,jdk,java .etc requirements

    http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.html 在oracle官 ...

  3. [EffectiveC++]item39:明智而审慎地使用private

    187页 private继承意味implementedin-terms-of(根据某物实现出).如果你让class D以private形式继承class B,你的用意为了采用class B内已经备妥的 ...

  4. NET平台微服务

    .NET平台微服务项目汇集   最近博客园出现了一篇文章<微服务时代之2017年五军之战:Net PHP谁先死>,掀起了一波撕逼,作者只是从一个使用者的角度来指点江山,这个姿势是不对的.. ...

  5. aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用

    引入 cglib-nodep-2.1_3.ja包 cglib产生的代理类是目标类的子类 定义接口,让切面都继承它,方便加入到动态代理方法 的那个类中使用 在SalaryInterceptor类中使用  ...

  6. Git bash 终止git log 命令

    Git bash中 可以通过键入: q ,结束该命令.

  7. 苹果手机(ios系统)蓝牙BLE的一些特点

    摘自<BluetoothDesignGuidelines.pdf>文档 1. pairing: 苹果手机无法主动发起SMP配对流程,可通过以下两种方式发起配对流程: (1)从端主动发起配对 ...

  8. Educational Codeforces Round 55 (Rated for Div. 2) C. Multi-Subject Competition 【vector 预处理优化】

    传送门:http://codeforces.com/contest/1082/problem/C C. Multi-Subject Competition time limit per test 2 ...

  9. 常用的css选择器

    1.最基本的 * * 选择所有元素. #id #firstname 选择 id="firstname" 的元素. .class .intro 选择 class="intr ...

  10. Android 进价5_自定义广播 通过广播更新ListView的适配器 下载管理

    1.在处理下载管理时,服务在后台运行,下载完成后要更新listview列表的按钮,将“下载”改成“打开”这样一个功能. 在Activity里面写一个静态内部类,继承广播.其中属性text_button ...