单表操做数据库
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
英文全称:less
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
一对多的数据操做spa
Classes班级表code
id name 对象
1 1班 blog
2 2班 ci
Students学生表 rem
id username age gender cs_id input
1 ago 12 男 1 it
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
需求:拿学生表的全部姓名
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')