單表操做數據庫
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')