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 

 

英文全稱: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 

 

  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')

相關文章
相關標籤/搜索