Django學習手冊 - ORM 數據創建/表操作 匯總

?ORM 查詢的數據類型:

  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)

?

?類對象

  <class 'models.表名'>類對象
  獲取字段數值為? 類.字段名?

?

?

創建 models 數據庫

  一對一表創建

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 E1(models.Model):id = models.IntegerField(primary_key=True)E11 = models.OneToOneField('A1',to_field='id',on_delete=models.CASCADE)E12 = models.CharField(max_length=20)# 定義 一對一關聯:
# 格式:
# 字段 = models.OneToOneFied('關聯表',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)

?

  外鍵(一對多創建)

# B1表跟A1表形成外鍵關系
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)# 定義 外鍵:
# 格式:
# 字段 = 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)

?

  多對多表創建

# C1表跟D1表形成多對多的關系
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)# 定義 多對多:
# 格式:
# 字段 = models.ForeignKey('關聯表',to_field='關聯表字段',on_delete=models.CASCADE)# 可添加參數:# through='UserFans'指定第3張關系表的表名# through_fields    指定第3張關系表的字段
# 示例:
# m = models.ManyToManyField('D1')

?

?多對多自關聯創建

# userinfo 形成多對多的自關聯
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')

?

ORM 操作

  單表操作/追加參數

# # 單表添加數據
# 單表操作# 格式:# 表名.objects.create()  # 導入的是表# module.表名.objects.create()  # 導入的是module模塊#
    # 添加方式一:# models.表名.objects.create(字段1='參數1', 字段2='參數2')#
    # 添加方式二:# obj = models.表名(字段1 = '參數1', 字段2 = '參數2')# obj.save()# 示例:# # 方式一# 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'>類對象: 就是一個類
#   相當于一個類,獲取字段數值為 類.字段名# 單表查詢數據# 查詢所有數據# 格式:#     info=models.表名.objects.all()# 返回值:# query_set對象集合 [對象1、對象2、.... ]# obj = models.A1.objects.all()# print(obj) # QuerySet 對象# 查詢單條數據#方式一 filter# 格式一:# info = models.表名.objects.filter(字段=參數)# 返回值:# 取值可以為  info[0]# query_set對象集合 [對象1]# 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'>類對象# .oder_by(-id):按照某列排序# .exclude(字段):字段獲取數據時排除#方式二 get# info = models.表名.objects.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()# 單表修改數據#修改方式1 update()# 格式:# models.表名.objects.filter(字段=參數).update(字段=參數)# 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)#修改方式2 obj.save()# obj = models.表名.objects.filter(字段=參數).get(字段=參數)# obj.字段 = 參數# obj.save()# ob1 = models.A1.objects.get(id=3)# ob1.A11 = 'A44'# ob1.A12 = 'A44'# ob1.A13 = 'A44'# ob1.save()# 更新數據操作:# 示例:# 格式:#  models.表名.objects.update_or_create(條件1=參數1, defaults={字段:屬性})# 示例:#  tk = username#    models.Token.objects.update_or_create(user=user, defaults={'token': tk})# 找到更新 如果沒有找到創建defaults={} 中的數據

?

  一對一表查詢

# 一對一表操作# 添加刪除修改(略)# # 查詢# 正向查詢(根據ontoon字段直接查詢)# info1 = models.E1.objects.filter(id=1).values('id','E12','E11__A12','E11__A13')# info2 = models.E1.objects.filter(id=1).first().E11# print(info1)  # QuerySet# print(info2)  # A1 object (3)# #反向查詢(反向查詢跟foreignkey不同時的不需要 表名_set 這里只需要對表表名即可)# info1 = models.A1.objects.filter(id=3).values('id','A12','e1__id','e1__E12')# info2 = models.A1.objects.filter(id=3).first().e1# print(info1)    # QuerySet# print(info2)    # E1 object (1)

?

  一對多表操作

# 一對多表操作(外鍵)# # 一對多表操作:# 添加方式一:# models.表名.objects.create(字段1='參數1',字段2='參數2',外鍵ID='參數')#
    # 添加方式二:# obj=models.表名(字段1='參數1',字段2='參數2',外鍵=參數)# obj.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類型

?

  多對多表操作

    #多對多表操作#多對多表添加操作# 如果兩表之間存在雙向1對N關系,就無法使用外鍵來描述其關系了;# 只能使用多對多的方式,新增第三張表關系描述表;# add()   添加# clear() 清空# remove() 刪除某個對象# 正向添加 通過 多對多字段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)

?

  查詢性能探究

    # 查詢性能 :# 1、select_related:結果為對象  注意query_set類型的對象 都有該方法# 原理: 查詢時主動完成連表形成一張大表,for循環時不用額外發請求;# 試用場景: 節省硬盤空間,數據量少時候適用相當于做了一次數據庫查詢;# info = models.B1.objects.filter(B11=4).all().select_related()# for i in info:#     print(i)# 2、prefetch_related:結果都對象是# 原理:雖好,但是做連表操作依然會影響查詢性能,所以出現prefetch_related# prefetch_related:不做連表,多次單表查詢外鍵表 去重之后顯示, 2次單表查詢(有幾個外鍵做幾次1+N次單表查詢,# 適用場景:效率高,數據量大的時候試用# info = models.B1.objects.filter(B11=4).all().prefetch_related()# for i in info:#     print(i)

?

  F查詢與Q查詢

# F查詢與Q查詢#F 可以獲取對象中的字段的屬性(列),并對其進行操作;# from django.db.models import F,Q# models.表名.objects.all().update(price=F('price')+1)   #所在的列進行操作# Q多條件組合查詢# Q()可以使orm的fifter()方法支持, 多個查詢條件,使用邏輯關系(&、|、~)包含、組合到一起進行多條件查詢;# 語法:# fifter(Q(查詢條件1)| Q(查詢條件2))# fifter(Q(查詢條件2)& Q(查詢條件3))# fifter(Q(查詢條件4)& ~Q(查詢條件5))# fifter(Q(查詢條件6)| Q(Q(查詢條件4)& ~ Q(Q(查詢條件5)& Q(查詢條件3)))包含# from django.db.models import F,Q#     1、F 可以獲取對象中的字段的屬性(列),并且對其進行操作;#     # models.Book.objects.all().update(price=F('price')+1)#     2、Q多條件組合查詢#     #如果 多個查詢條件 涉及到邏輯使用 fifter(,隔開)可以表示與,但沒法表示或非得關系#     #查詢 書名包含作者名的書#     book=models.Book.objects.filter(title__icontains='偉',author__name__contains='偉').values('title')#     #如何讓orm 中得 fifter 支持邏輯判斷+多條件查詢? Q()登場#     book=models.Book.objects.filter(Q(title__icontains='偉') & Q(author__name__contains='偉')).values('title')#     book=models.Book.objects.filter(Q(author__name__contains='偉') & ~Q(title__icontains='偉')).values('title')#
        #    #多條件包含組合查詢#    #查詢作者姓名中包含 方/少/偉/書名包含偉3字 并且出版社地址以山西開頭的書#     book=models.Book.objects.filter(#                                     Q(#                                     Q(author__name__contains='方') |#                                     Q(author__name__contains='少') |#                                     Q(title__icontains='偉')|#                                     Q(author__name__contains='偉')#                                     )#                                     &#                                     Q(publish__addr__contains='山西')#                                     ).values('title')#     print(book)# 注意:Q查詢條件和非Q查詢條件混合使用注意,不包Q()的查詢條件一點要放在Q(查詢條件)后面

?

部分資料查詢于
https://www.cnblogs.com/sss4/p/7070942.html

?

轉載于:https://www.cnblogs.com/Anec/p/9981899.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

applet實現大文件ftp上傳(三)

下一步呢&#xff0c;當然就是對這個jar文件進行數字證書包裝。流程如下&#xff1a; <1>、生成密匙證書(key certificate)&#xff0c;該證書將存儲在你的.keystore文件中。Validity指的是密匙的有效期&#xff0c;默認是180&#xff0c;但是這里我們需要一年的時間&am…

網站301重定向 解決方法

網站301重定向&#xff0c;一般都是將不帶www的域名轉向帶有www的&#xff0c;有幾個小朋友問過幾次需要在哪改&#xff0c;寫出來不會的參考下。 1、新建一個“.htaccess”文件 2、復制以下代碼&#xff1a;&#xff08;a你的域名&#xff09; Options FollowSymLinks rewrite…

Vue 從入門到進階之路(十四)

之前的文章我們對 vue 的基礎用法已經有了很直觀的認識&#xff0c;本章我們來看一下 vue 中的生命周期函數。 上圖為 Vue官方為我們提供的完整的生命周期函數的流程圖&#xff0c;下面的案例我們只是走了部分情況流程&#xff0c;但所有的生命周期函數都涉及到了。 1 <!DOC…

css 清除浮動float 嗒嘀嗒滴 ----20181120

手動給父元素添加高度通過clear清除內部和外部浮動給父元素添加overfloat屬性并結合zoom:1使用給父元素添加浮動        常用方法&#xff1a; ①給兄弟元素添加clear屬性&#xff1a;添加一個class為clear&#xff1a;both&#xff0c; ②添加偽類&#xff1a;.clearf…

applet實現大文件ftp上傳(一)

由于要用APPLET實現大文件FTP上傳下載&#xff0c;從網上搜索了幾下&#xff0c;找到很多資料&#xff0c;最后決定采用基于 org.apache.commons.net.ftp包實現FTP上傳下載&#xff0c;Net包中的類既提供對協議的底層訪問也有高層的抽象。在大多數情況下&#xff0c;抽 象是足夠…

微軟最爽命令行工具發布!

最近微軟發布了命令行工具Windows Terminal&#xff0c;簡直要讓我們爽翻天 長期以來&#xff0c;Linux和Mac下的命令行工具自成一派&#xff0c;Windows卻是另一套命令系統。這就比較惡心了&#xff0c;這也是很多開發者不選擇Windows系統的原因。 但是現在完全不一樣了&#…

定時任務 Cron表達式

Cron表達式由6~7項組成&#xff0c;中間用空格分開。從左到右依次是&#xff1a; 秒、分、時、日、月、周幾、年&#xff08;可省略&#xff09; Cron表達式的值可以是數字&#xff0c;也可以是以下符號&#xff1a; "*"&#xff1a;所有值都匹配 "?"&…

vue項目中 axios請求攔截器與取消pending請求功能 - 年少、 - 博客園

在開發vue項目中&#xff0c;請求是不可缺少的&#xff0c;在發送請求時常常需要統一處理一些請求頭參數等設置與響應事件&#xff0c;這時利用請求攔截器再好不過。 這里以axios請求為例 實現了設置統一請求頭添加token, 其中token在登錄時被存入了localStorage中。 同時攔…

gitbook 入門教程之解決windows熱加載失敗問題

破鏡如何貼花黃 gitbook 在 Windows 系統無法熱加載,總是報錯! gitbook 是一款文檔編寫利器,可以方便地 markdown 輸出成美觀優雅的 html ,gitbook serve 啟動服務器后,原來相貌平平的 markdown 丑小鴨搖身一變就成了傾國傾城的 html 絕色佳人. 如果源文件發生更改,Windows 卻無…

理解DOM事件流的三個階段 - Lxxyx的開發筆記 - SegmentFault 思否

本文主要解決兩個問題&#xff1a; 什么是事件流 DOM事件流的三個階段 起因 在學習前端的大半年來&#xff0c;對DOM事件了解甚少。一般也只是用用onclick來綁定個點擊事件。在寒假深入學習JavaScript時&#xff0c;愈發覺得自己對DOM事件了解不夠&#xff0c;遂打開我的《J…

支付寶APP支付 統一下單 php服務端 tp5

/*支付寶第三方支付 * *生成APP支付訂單信息 * param number  uid 用戶id * param string   token 用戶token * param number  oid 訂單id * param string   title 標題 * param string    body …

python第十九天(random、json、pickle、hashlib、hmac、shutil、shevle模塊)

今日內容&#xff1a; 1. random 模塊 2. json模塊 3. pickle 模塊 4.hashlib 模塊 5. hmac 模塊 6. shutil 模塊 7. shelve 模塊 1. random 模塊&#xff1a; random 模塊 獲取隨機值import randomfor i in range(10): print(random.random()) # random.random() 隨機獲取…

NodeJS入門04-Express路由和中間件 - 小之 - 博客園

nodeJS入門04-Express路由和中間件 Express框架是后臺的Node框架&#xff0c;在后臺的受歡迎的程度&#xff0c;和jQuery一樣&#xff0c;就是企業的事實上的標準。 路由 路由是指如何定義應用的端點&#xff08;URIs&#xff09;以及如何響應客戶端的請求。 路由是由一個 …

jmeter(四十五)常用Beanshell腳本

整理了一批jmeter常用的beanshell腳本供大家參考&#xff01; 時間戳 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; try{ Date date new Date(); //獲取當前時間 SimpleDateFormat sf new SimpleDateFormat("yyyy-MM-dd HH:mm…

Critical error detected c0000374

我發現出現上述錯誤是 free 兩次內存 float* ddnew float[2];delete[] dd;delete[] dd;轉載于:https://www.cnblogs.com/hook-gou/p/9994662.html

nodejs開發 過程中express路由與中間件的理解 - pyj063 - 博客園

nodejs開發 過程中express路由與中間件的理解 nodejs開發 express路由與中間件 路由 通常HTTP URL的格式是這樣的&#xff1a; http://host[:port][path] http表示協議。 host表示主機。 port為端口&#xff0c;可選字段&#xff0c;不提供時默認為80。 path指定請求資源的…

錯誤MSB4018 “ResolvePackageAssets”任務意外失敗的解決方法

昨天系統奔潰了&#xff0c;重裝系統后發現&#xff0c;之前寫的.netcore項目打開后重新生成報錯&#xff0c;錯誤如下嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態 錯誤 MSB4018 “ResolvePackageAssets”任務意外失敗。 NuGet.Packaging.Core.Packag…

(五)Unity插件生成

1&#xff09;新建空的AndroidStudio工程&#xff0c;但是新建過程時最小SDK版本要與unity一致&#xff0c;如下圖所示&#xff0c;本次操作均為api16 2&#xff09;創建Library&#xff0c;如下圖所示&#xff0c;新建module&#xff0c;然后選擇Android Library。 新建模塊為…

centeros7安裝mysql - 風中追風_lonely - 博客園

轉載自&#xff1a;https://www.linuxidc.com/Linux/2016-09/135288.htm 安裝之前先安裝基本環境&#xff1a;yum install -y perl perl-Module-Build net-tools autoconf libaio numactl-libs 1、配置YUM源 在MySQL官網中下載YUM源rpm安裝包&#xff1a;http://dev.mysql.c…

失物招領平臺6

昨天做了什么&#xff1a;學習了復選框、列表視圖、網絡視圖&#xff0c;集體討論了登錄頁面的構思 今天準備做什么&#xff1a;繼續學習Android stdio&#xff0c;改善登錄頁面 遇到的問題&#xff1a;時間遠遠不夠。轉載于:https://www.cnblogs.com/sljslj/p/11056074.html