Django學習手冊 - ORM 數據表操作
阿新 • • 發佈:2018-11-19
而是 tab mode create 列表 object primary 字典類 金庸
queryset 數據類型介紹
QuerySet與惰性機制
所謂惰性機制:表名.objects.all()或者.filter()等都只是返回了一個QuerySet(查詢結果集對象),它並不會馬上執行sql,而是當調用QuerySet的時候才執行。
QuerySet特點:
<1> 可叠代的
<2> 可切片
<3> 惰性計算和緩存機制
例:
info=models.table_name.objects.all()[0:5] #切片 info= models.table_name.objects.all()[3] #索引 info= models.table_name.objects.all() #可叠代 print(info.title) for obj in info: print(obj.title)
ORM數據表 操作:
添加數據操作:
# 單表操作 格式: 表名.objects.create() #導入的是表 module.表名.objects.create() #導入的是module模塊 添加方式一: models.表名.objects.create(字段1=‘參數1‘,字段2=‘參數2‘) 添加方式二: obj=models.表名(字段1=‘參數1‘,字段2=‘參數2‘) obj.save() # 一對多表操作: 添加方式一: models.表名.objects.create(字段1=‘參數1‘,字段2=‘參數2‘,外鍵ID=‘參數‘) 添加方式二: obj=models.表名(字段1=‘參數1‘,字段2=‘參數2‘,外鍵=參數) obj.save() # 多對多表操作: 如果兩表之間存在雙向1對N關系,就無法使用外鍵來描述其關系了; 只能使用多對多的方式,新增第三張表關系描述表; book=models.Book.objects.get(title=‘笑傲江湖‘) author1=models.Author.objects.get(name=‘金庸‘) author2=models.Author.objects.get(name=‘張根‘) book.author.add(author1,author2) 書籍和作者是多對多關系, 切記:如果兩表之間存在多對多關系,例如書籍相關的所有作者對象集合,作者也關聯的所有書籍對象集合 book=models.Book.objects.get(title=‘西遊記‘) author=models.Author.objects.get(name=‘吳承恩‘) author2 = models.Author.objects.get(name=‘張根‘) book.author.add(author,author2) #add() 添加 #clear() 清空 #remove() 刪除某個對象
更新數據操作:
示例:
格式: models.表名.objects.update_or_create(條件1=參數1, defaults={字段:屬性}) 示例: tk = username models.Token.objects.update_or_create(user=user, defaults={‘token‘: tk})
找到更新 如果沒有找到創建defaults={} 中的數據
修改數據操作:
#修改方式1 update() 格式: models.表名.objects.filter(字段=參數).update(字段=參數) 示例: models.Book.objects.filter(id=1).update(price=3) #修改方式2 obj.save() obj = models.表名.objects.filter(字段=參數).get(字段=參數) obj.字段 = 參數 obj.save() book_obj=models.Book.objects.get(id=1) book_obj.price=5 book_obj.save()
查詢數據
查詢所有數據: 格式: info=models.表名.objects.all() 返回值: # query_set對象集合 [對象1、對象2、.... ] 單條查詢: 格式一: info=models.表名.objects.filter(字段=參數) 返回值: # 取值可以為 info[0] # query_set對象集合 [對象1] 格式二: info=models.表名.objects.get(字段=參數) 返回值: # 單個對象,沒有找到會報錯 可追加參數: .first() / .last() 格式: info=models.表名.objects.filter/get(字段=參數) .first() / .last() 返回值: # query_set字典集合 [{一條記錄},{一條記錄} ] 元組類型
實際操作:
from django.db import models # Create your models here. # 定義 外鍵: # 格式: # 字段 = models.ForeignKey(‘關聯表‘,to_field=‘關聯表字段‘,on_delete=models.CASCADE) # 可添加參數: # related_name=名字 #外鍵反向查找別名(方便反向查找) # 使用方式; obj.名字.all() #在寫ForeignKey字段的時候,如果想要在反向查找時不使用默認的 小寫的表名_set,就在定義這個字段的時間加related參數! # related_query_name 字段=別名 # 使用方式; obj.別名.all() # 一張表內兩個外鍵 需要添加 related_query_name= 名字 從而識別是哪個外鍵值 # 示例: # B11 = models.ForeignKey(‘A1‘,to_field=‘id‘,on_delete=models.CASCADE) # 定義 多對多: # 格式: # 字段 = models.ForeignKey(‘關聯表‘,to_field=‘關聯表字段‘,on_delete=models.CASCADE) # 可添加參數: # through=‘UserFans‘指定第3張關系表的表名 # through_fields 指定第3張關系表的字段 # 示例: # m = models.ManyToManyField(‘D1‘) class A1(models.Model): id = models.IntegerField(primary_key=True) A11 = models.CharField(max_length=20) A12 = models.CharField(max_length=20) A13 = models.CharField(max_length=20) class B1(models.Model): id = models.IntegerField(primary_key=True) B11 = models.ForeignKey(‘A1‘,to_field=‘id‘,on_delete=models.CASCADE) B12 = models.CharField(max_length=20) B13 = models.CharField(max_length=20) class C1 (models.Model): id = models.IntegerField(primary_key=True) m = models.ManyToManyField(‘D1‘) C12 = models.CharField(max_length=20) C13 = models.CharField(max_length=20) class D1 (models.Model): id = models.IntegerField(primary_key=True) D12 = models.CharField(max_length=20) D13 = models.CharField(max_length=20) class Userinfo(models.Model): nikename=models.CharField(max_length=32) username=models.CharField(max_length=32) password=models.CharField(max_length=64) sex=((1,‘男‘),(2,‘女‘)) gender=models.IntegerField(choices=sex) m=models.ManyToManyField(‘Userinfo‘)
# # 單表添加數據 # # 方式一 # models.A1.objects.create(A11=‘A1‘,A12=‘1‘,A13=‘1‘) # # # 方式二 # data = {‘A11‘: ‘A2‘, ‘A12‘: ‘2‘, ‘A13‘: ‘2‘} # models.A1.objects.create(**data) # # # 方式三 # data2 = {‘A11‘: ‘A3‘, ‘A12‘: ‘3‘, ‘A13‘: ‘3‘} # obj = models.A1(**data2) # obj.save() # QuerySet 數據類型:可以看作是一個列表 # QuerySet 對象,可切片,索引,叠代 # <class ‘models.A1‘>類對象: 就是一個類 # 相當於一個類,獲取字段數值為 類.字段名 # 單表查詢數據 # 查詢所有數據 # obj = models.A1.objects.all() # print(obj) # QuerySet 對象 # 查詢單條數據 #方式一 filter # obj2 = models.A1.objects.filter(id=1) #查詢不到數據為 空 QuerySet對象 # print(obj2) # QuerySet 對象 # # filter 可追加參數 # obj21 = models.A1.objects.filter(id=1).first() #第一條 # obj22 = models.A1.objects.filter(id=1).last() #最後一條 # obj23 = models.A1.objects.filter(id=1).values_list() #元組類型輸出 # obj24 = models.A1.objects.filter(id=1).values() #字典類型輸出 # # print(type(obj21/22/23/24)) #<class ‘models.A1‘>類對象 #方式二 get # obj3 = models.A1.objects.get(id=1) #查詢不到數據報錯!!!! # print(obj3) # print(type(obj3)) #<class ‘models.A1‘>類對象 # 單表刪除數據 # 方式一: # models.A1.objects.filter(id=1).delete() # 方式二: # ob1 = models.A1.objects.get(id=1) # ob1.delete() # ob1.save() # 單表修改數據 #方式一: # models.A1.objects.filter(id=3).update(A11=‘A33‘,A12=‘A33‘,A13=‘A33‘) # data_updata = {‘A11‘:‘A33‘,‘A12‘:‘A33‘,‘A13‘:‘A33‘} # models.A1.objects.filter(id=4).update(**data_updata) # # 方式二: # ob1 = models.A1.objects.get(id=3) # ob1.A11 = ‘A44‘ # ob1.A12 = ‘A44‘ # ob1.A13 = ‘A44‘ # ob1.save() # 一對多表操作(外鍵) # 一對多添加數據 #方式一 # data = {‘B12‘:‘B66‘,‘B13‘:‘B66‘,‘B11_id‘:3} # models.B1.objects.create(**data) #方式二 # data = {‘B12‘:‘B55‘,‘B13‘:‘B55‘,‘B11_id‘:4} # obj = models.B1(**data) # obj.save() # 一對多表刪除數據(跟單表操作一樣) # 方式一: # models.B1.objects.filter(id=6).delete() # 方式二: # models.B1.objects.get(B12=‘B66‘).delete() # 一對多表修改數據(跟單表操作一樣) # models.B1.objects.filter(id=3).update(B11_id=4) #一對多表查詢數據(跨表查詢) # 一對多表 跨表查詢(正向查找 B表-外鍵字段-A表字段,下面兩句等效) # info = models.B1.objects.filter(id=3).first().B11 # info2 = models.B1.objects.get(id=3).B11 # print(info) # A1 object (4) # print(info2) # A1 object (4) # # 一對多表 跨表查詢(反向查找)(下面兩條結果一致) # #方式一(根據 類的方式查找 ) (info.小寫表名_set) # info = models.A1.objects.filter(id=4) # info1 = info.first().b1_set.values() # print(info1) #values --- QuerySet類型 # #方式二(根據values方式查找)(在values中 ‘小寫表名__字段名‘ ) # info2 = models.A1.objects.values(‘b1__B11‘,‘b1__B12‘,‘b1__B13‘).filter(id=4) # print(info2) #values --- QuerySet類型 #多對多表操作 #多對多表添加操作 # 正向添加 通過 多對多字段m.add增加 #C1表id =1 字段 關聯 D1表的 id = 1,2,3 # obj = models.C1.objects.filter(id=1).first() # obj.m.add(1,2,3) # 反向添加 通過 小寫表名_set.add增加 # D1表id =1 字段 關聯 C1表的 id = 1,2,3 # obj2 = models.D1.objects.filter(id=1).first() # obj2.c1_set.add(1,2,3) #C1 id=3 關聯 D1表id>3的數據 # obj1 = models.C1.objects.filter(id=3).first() # obj2 = models.D1.objects.filter(id__gt=3) # obj1.m.add(*obj2) #多對多表刪除操作 # 正向刪除 # obj1 = models.C1.objects.filter(id=1).first() # obj1.m.remove(1,2,3) # 逆向刪除 # obj2 = models.D1.objects.filter(id=1).first() # obj2.c1_set.remove(2,3) # 清除數據 # obj3 = models.C1.objects.filter(id=3).first() # obj3.m.clear() #多對多修改 # ManyToManyField()字段 自動創建第3張關系表,可以使用字段跨表查詢,但無法直接操作第3張表, # obj.m.all() 只有查詢和清空 方法 #多對多查詢 # 正向查詢(通過多對多字段 直接查詢) # obj = models.C1.objects.get(id=3).m.values() # print(obj) # 反向查詢(通過.表名_set 查詢) # obj = models.D1.objects.get(id=1).c1_set.values_list() # print(obj) #---------------------------------------------- # 多對多自關聯(由原來的3張表,變成只有2張表) # 把兩張表通過 choices字段合並為一張表 # ‘第三張關系表’ 使用models.ManyToManyField(‘Userinfo‘)生成 # 同表正反向查詢 # 多對多 自關聯 通過男士查詢女生 # boy_obj = models.Userinfo.objects.filter(id=2).first() # res = boy_obj.m.all() # for row in res: # print(row.nikename) # # 多對多自關聯 之通過女士查詢男生 # girl_obj = models.Userinfo.objects.filter(id=4).first() # res = girl_obj.userinfo_set.all() # for obj in res: # print(obj.nikename)
Django學習手冊 - ORM 數據表操作