Django的models操作

?

一、先看單表操作

方式1:

    models.book.objects.create(Book_name = "aaa",Book_info = "bbb",Book_price = "ccc",Book_num = "ddd")

 

方式2:用2個*號傳遞一個字典進去 

    book_info = {"Book_name":"aaa","Book_info":"bbb","Book_price":"ccc","Book_num":"ddd"}models.book.objects.create(**book_info)

  

刪,通過delete方法

可以通過表中的每個字段進行刪除

models.book.objects.filter(id=1).delete()models.book.objects.filter(Book_name="book1").delete()

  

改,通過update方法,要 調用update方法,必須要querySet對象才可以,比如filter和all方法返回的是一個對象集合,通過get方法返回的單個對象是不能調用update方法的

    models.book.objects.filter(id=1).update(Book_name = "aaa",Book_info = "bbb",Book_price = "ccc",Book_num = "dd")

  

models.book.objects.filter(Book_name="book6").update(Book_name="aaaaaaaaaaaaaaaa")

  

get方法:返回單個對象

models.book.objects.all().get(id=2)

  

filter方法:返回一個對象集合

models.book.objects.filter(id=1)

  

values方法:返回一個對象集合的字典形式,也可以只返回指定的字段

 models.book.objects.filter(id=1).values("Book_name","Book_info")

  

print(models.book.objects.all().values())

  

values_list方法:返回一個對象集合的列表的形式

print(models.book.objects.all().values_list())

  

count方法:統計數據的個數

print(models.book.objects.filter(Book_name="book3").count())

  

exists方法:統計對象集合中是否有數據,有則為ture,無則為false

print(models.book.objects.filter(Book_name="book3").count())

 

exclude:返回不符合某個條件的對象集合

models.book.objects.exclude(id=2)

  

order_by:按照指定的字段從小到大排列

models.book.objects.order_by("Book_price")

  

order_by:按照指定的字段從大到小排列

models.book.objects.order_by("-Book_price")

  

reverse:和orader_by加一個符號的效果一樣,逆序排列

models.book.objects.reverse("id")

  

distanct:對結果去重,這里不能對單個字段去重,只能對所有的字段去重

models.book.objects.all().distinct()

  

?

二、在看一對多操作

一對多和一對一基本上一樣,只有插入數據這里有點不一樣

    # 先看一對多# 我們先看下ForeignKey這個字段的值該如何插入# 雖然我們寫的的Book_pub,但是實際上在數據庫中存儲的字段是Book_pub_id,所以這里有兩種方式來搞# 如果我們知道書對應的出版社的id,則可以直接用Book_pub_id賦值這個數字就可以了# Book_pub_id = 4## 我們還可以直接從數據庫取出出版社的對象,然后Book_pub賦值給一個出版社的對象就可以了# Book_pub = Publish的對象

  

另外一點不一樣的就是,如果在一所對應的表中刪除數據,那么會同步刪除多表中的包含該一的字段

比如書1的出版社是出版社1,書2的出版社是出版社1,那么如果我們在出版社表中刪除出版社1,那么不僅僅出版社表中的出版社1的數據會被刪除,書表中的書1和書2都會被同步刪除

?

我們看下一對多如何增加數據

?因為書和出版社是一對多的關系,我們先獲取一個出版社對象

    publish_obj = models.Publish.objects.filter(id=5)[0]models.book.objects.create(Book_name = "django",Book_info = "這是一本寫django的書",Book_price = 100,Book_num = 20000,Book_pub = publish_obj)

  

或者直接賦值id

    models.book.objects.create(Book_name = "Flask",Book_info = "這是一本寫Flask的書",Book_price = 100,Book_num = 20000,Book_pub_id = 5)

  

我們查看數據庫,已經創建了2條數據

?

?下面我們看下一對多的刪除

我們先刪除出版社id為5的數據,看下有什么效果

models.Publish.objects.filter(id=5).delete()

  

我們發現Publish中id為5的數據已經被刪除

同樣在book表中,關聯publish表中id為5的數據也被刪除

?

我們在看下刪除book表中的數據

?

models.book.objects.filter(id=8).delete()

  

我們看到數據庫中已經刪除這條數據

?

?

我們在看改

我們在創建兩條數據

?

?先把book表中的數據更新

models.book.objects.filter(id=14).update(Book_name="python教程")

  

我們查看數據庫發現名稱已經更改

我們在來嘗試下修改publish_id

?

 models.book.objects.filter(id=14).update(Book_pub_id=1)

  

我們在來看數據庫

?

?發現已經更改

我們最后來看下查

首先我們看正向查詢,正向查詢的意思就在有外鍵的表查詢

通過all方法查看

    obj = models.book.objects.all()print(obj)

  

結果如下

?

查看某條數據的信息

    obj = models.book.objects.filter(id=13)[0]print(obj.Book_Auther)print(obj.Book_pub)print(obj.Book_pub_id)

  

結果如下

?

?我們還可以通過兩個下劃線做跨表查詢

    obj = models.book.objects.all().values("Book_name","id","Book_pub__id","Book_pub__Pub_name")print(obj)obj = models.book.objects.all().values_list("Book_name","id","Book_pub__id","Book_pub__Pub_name")print(obj)

  

結果如下

?

?

我們在來看逆向查詢,通過沒有外鍵的表查詢

1、先拿到一個對象,記住,這里不能使用對象集合,下面的例子,第一個obj是一個錯誤的示范

    obj = models.Auther.objects.filter(id=1)obj = models.Auther.objects.get(id=1)

  

2、通過set方法查詢,記住values里面的字段和正向查詢是一樣的

    obj = models.Auther.objects.get(id=1)##print(obj.book_set.values("Book_name","Book_pub__Pub_name"))

  

我們看結果

?

?我們可以查詢某個出版社出版了幾本書

    obj = models.Publish.objects.filter(id=1)[0]print(obj.book_set.all().count())

  

我們可以查看某個出版社出版的書的名稱

    obj = models.Publish.objects.filter(id=1)[0]print(obj.book_set.all().count())print(obj.book_set.all().values("Book_name"))

  

三、再看多對多操作

?先看怎么創建多對多的關系

方式1,由django為我們創建第三張表

Book_Auther = models.ManyToManyField("Auther")

  

add方法

    book = models.book.objects.filter(id=1)[0]auther1 = models.Auther.objects.filter(id=1)[0]auther2 = models.Auther.objects.get(id=2)book.Book_Auther.add(auther1,auther2)

 

結果 

?

?

remove方法

    book = models.book.objects.filter(id=1)[0]auther1 = models.Auther.objects.filter(id=1)[0]auther2 = models.Auther.objects.get(id=2)# book.Book_Auther.add(auther1,auther2)book.Book_Auther.remove(auther1)

  

結果

?

我們在看反向添加,在沒有manytomanyfiled的表出發去執行命令,需要一個_set方法

    book1 = models.book.objects.filter(id=1)[0]book2 = models.book.objects.get(id=2)auther2 = models.Auther.objects.get(id=2)auther2.book_set.add(book1,book2)

  

結果

?

?

在看反向移除,也要用到_set方法

    book1 = models.book.objects.filter(id=1)[0]book2 = models.book.objects.get(id=2)auther2 = models.Auther.objects.get(id=2)# auther2.book_set.add(book1,book2)auther2.book_set.remove(book1)

  

結果如下

?

?

?

方式2、我們自己創建第三張表

class BookToAuther(models.Model):book = models.ForeignKey("book")auther = models.ForeignKey("Auther")

  

在看如何為多對多表中插入數據,我們先看下第三張表由django為我們創建的表的情況

為一個書添加多個作者

    # 獲取一個書的對象book_obj = models.book.objects.filter(id=1)[0]# 獲取2個作者的對象auther1 = models.Auther.objects.filter(id=1)[0]auther2 = models.Auther.objects.all().get(id=2)# 為這個書添加2個作者對象book_obj.Book_Auther.add(auther1,auther2)# 為這個書添加2個對象的另外一種方式book_obj.Book_Auther.add(*[auther1,auther2

  

?把add換成remove就是解除綁定

?

反向查詢這里,book是小寫的,就算你的book表是大寫的,這里也要變為小寫

?

?

?

多對多,如果我們自己創建第三張表,那么就在第三表中對book和auther都寫上外鍵,就相當于一個多對多,那么我們操作第三張表和一對多是一樣的

?

# 第二種方式創建多對多的第三張表class BookToAuther(models.Model):
class BookToAuther(models.Model):book = models.ForeignKey("book")auther = models.ForeignKey("Auther")

  

?

?

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我們在來看下查詢的其他方法

1、切片操作

    obj = models.book.objects.all()[0:1]print(obj)obj = models.book.objects.all()[0:10:2]print(obj)

  

結果如下

?

2、拿到指定書名對應的出版社的名稱

    # 先拿到書的對象,然后根據外鍵就獲取一表中的對象,然后根據這個對象就可以獲取另外一張表的的字段的信息obj = models.book.objects.filter(Book_name="shu2")[0].Book_pub.Pub_nameprint(obj)

?

結果

?

 

?

3、拿到某個出版社出版的所有書的名稱,book_set返回的是一個query_set對象

    # 先拿到出版社的對象,然后通過book_set方法拿到書這個表的內容,然后通過values方法去獲取指定的字段obj = models.Publish.objects.filter(Pub_name="chubanshe4")[0].book_set.all().values("Book_name")print(obj)obj = models.Publish.objects.filter(Pub_name="chubanshe4")[0].book_set.all().values_list("Book_name")print(obj)

 結果 

 

?

4、拿到id大于2的書的名稱和id

    # 查詢id大于2的書的名稱obj = models.book.objects.filter(id__gt=2)print(obj.values("id","Book_name"))

  

結果如下

?

5、其他一些雙下劃線的單表查詢的方法

 # 小于obj = models.book.objects.filter(id__lt=2)# 大于等于obj = models.book.objects.filter(id__gte=2)# 小于等于obj = models.book.objects.filter(id__lte=2)obj = models.book.objects.filter(id__in=[1,2,4,6])# 包含,區分大小寫obj = models.book.objects.filter(Book_name__contains="chuban")# 包含,不區分大小寫obj = models.book.objects.filter(Book_name__icontains="chuban")# 以什么開頭,區分大小寫obj = models.book.objects.filter(Book_name__startwith="chuban")# 以什么開頭,不區分大小寫obj = models.book.objects.filter(Book_name__istartwith="chuban")# 以什么結尾,區分大小寫obj = models.book.objects.filter(Book_name__endwith="chuban")# 以什么結尾,不區分大小寫obj = models.book.objects.filter(Book_name__iendwith="chuban")

  

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

關聯查詢

1、查詢書的名稱是shu0的出版社的信息,要求是通過出版社這張表去查,這個意思book表中的 book_name字段,因為出版社中沒有外鍵,則只能通過表名去做跨表查詢

    obj = models.Publish.objects.filter(book__Book_name="shu0")print(obj.all())

  

?

fiilter中可以有多個過濾的字段,這些過濾的字段通過逗號隔開,這幾個字段是取交集的

?

2、我們還可以通過書的表去查詢出版社的信息,那么這里就不能用表明,而是用在書中的外鍵的字段,因為書的表中有外鍵,所有要用外鍵的字段去做跨表查詢

    obj = models.book.objects.filter(Book_pub__Pub_name="chubanshe1")print(obj.all())

  

?

?

?

補充一個小點,model的form驗證

我們在models中創建表,可以選擇CharField,也可以選擇EmailField,但是如果我們選擇了EmailField,就算我們輸入的不是郵箱格式,我們也可以正常插入數據,那么是不是這個字段沒有作用呢?

我們先看下例子吧

1、在model創建表

class test(models.Model):u = models.CharField(max_length=64,null=True)e = models.EmailField(max_length=12,null=True)

  

2、然后我們插入數據

2_1、create方法插入數據

models.test.objects.create(u="aaaa",e="111111")

  

可以插入成功

?

2_2、save方法插入數據

    obj = models.test()obj.u = "2222"obj.e = "22222"obj.save()

  

可以插入成功

?

看起來這個EmailField確實沒有什么作用,其實不然,如果我們這樣搞的話,他就會校驗數據的合法性,使用clear_fields方法,就可以校驗合法性

    obj = models.test()obj.u = "3333"obj.e = "3333"res = obj.clean_fields()print(res)obj.save()

  

?我們看到后臺報錯了

?

?數據庫中也沒有插入數據

如果我們輸入正確的郵箱格式,則可以添加成功

    obj = models.test(u="33333",e="33333@qq.com")res = obj.clean_fields()print(res)obj.save()

 

數據庫也插入數據成功

 

?

?

先簡單的介紹下model的forms,就到此為止吧

?

轉載于:https://www.cnblogs.com/bainianminguo/p/9069876.html

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

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

相關文章

ngingx安裝錯誤 ./configure: error: the HTTP rewrite module requires the PCRE library.

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. ngnix 安裝報錯: 2. 解決: 安裝pcre-devel解決問題,運行命令 yum -y install pcre-devel 3.…

32--數組中重復的數字

1. 問題描述 找出數組中重復的數字。 在一個長度為 n 的數組 nums 里的所有數字都在 0~n-1 的范圍內。數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。 示例 1&#xff1…

實習期間的一些思考整理(3)2018.4.12~4.13

青云訣游戲體驗日報-2018.4.12 今日關鍵點:核心玩法 青云訣的核心玩法是“戰斗”、“成長”、“探索”(這三點也是RPG類型的要素),側重于成長。 我是這樣想的,要想找出核心玩法是什么,就要看哪些玩法沒了&a…

整理的最全 python常見面試題(基本必考)

訪問flyai.club,一鍵創建你的人工智能項目作者:大蛇王https://blog.csdn.net/t8116189520/article/details/801655891、大數據的文件讀取① 利用生成器generator②迭代器進行迭代遍歷:for line in file2、迭代器和生成器的區別1)迭代器是一個…

Nginx安裝手冊(摘自入云龍老師教案,親測可用)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Nginx安裝手冊 一、 nginx安裝環境 nginx是C語言開發,建議在linux上運行,本教程使用Centos6.5作為安裝環境。 …

33--二維數組中的查找

1.問題描述 在一個 n * m 的二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 示例: 現有矩陣 matrix 如下&…

XML Schema是什么

XML Schema 本身也是一種XML構造,它用來描述[哪個元素,在什么時候出現],[該元素具有什么樣的屬性]等等,也就是說,XML Schema是對XML的樹形構造加以描述說明的一種語言。原本,使用DTD對XML的樹形構造加以描述…

js之base64上傳圖片

首先要搭建好springmvc,詳見https://www.cnblogs.com/zzb-yp/p/9295397.html 整體思路:前端代碼包括顯示和傳參(這里的參數主要就是圖片的base64字符串),顯示主體部分是type“file”類型的input組件和一個提交按鈕 …

一些常用軟件的網絡端口協議分類介紹

最近有朋友請教我有關實現校園局域網視頻功能軟件的編寫問題,涉及到端口有關的知識,自己查了一些資料,發現這篇文章總結得比較不錯,常用軟件涵蓋得比較豐富,很實用,需要用到的時候可以查閱。于是決定將這篇…

WPF 使用皮膚影響按鈕自定義

在WPF項目中使用了 Theme的皮膚后,發現自定義的按鈕全部都是 皮膚里面的樣式,如下圖: 要自定義樣式,只有不給按鈕使用皮膚樣式。 如果想給某一個控件使用樣式,在前端Xaml的控件中,設置一下屬性即可&#xf…

各種數據庫對應的jar包、驅動類名和URL格式

見:http://blog.csdn.net/xuguiyi100/article/details/7970379 maven/Java/web/bootstrapQQ群:566862629。希望更多人一起幫助我學習。 1.1. 各種數據庫對應的jar包 具體如下: 數據庫類型 對應的Jar文件 Oracle 8i classes12.zip 或…

34--替換空格

1.問題描述 請實現一個函數,把字符串 s 中的每個空格替換成"%20"。 示例 1: 輸入:s “We are happy.” 輸出:“We%20are%20happy.” 2.解題思路 由于每次替換從 1 個字符變成 3 個字符,使用字符數組可方…

HTML的xmlns的作用

作用:由于xml允許定義自己的標記,但你定義的標記和其他人定義的標記有可能相同,但表示不同的含義。當文檔交換或者共享的時候就容易產生錯誤。為避免這種錯誤產生,xml采用名字空間聲明,允許你通過一個網址來識別你的標…

樹鏈剖分 講解+模板+習題

今天我們來講一下樹鏈剖分 樹鏈剖分是什么? 樹鏈剖分是一種用來維護樹上路徑信息的在線方法,可以處理在線。 通常通過一種方法,將一棵樹剖分成若干條鏈,然后通過數據結構(線段樹,BIT等)去維護。…

navicat 批量插入 測試數據

1. 前言 遇到線上大sql執行較慢, 10s, 做優化改進時,首先想到的是在本地造出一個類似的庫環境,先本地實驗。 然后往表中創建大量數據... 2. 方案 利用mysql函數來插入大量數據 代碼 BEGIN#Routine body goes here... DECLARE id int; DECLARE driverid …

互聯網產品用戶體驗設計的三大定律

好友發過來一PPT,文件名是互聯網產品的體驗設計,認真看完,收獲頗多,其中印象最深刻的是用戶體驗可用性的三大定律,正好FasterSoft正在打造互聯網精品平臺iWorld,最需要的時候好東西就上門來了,這…

oracle 對應的JDBC驅動 版本

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Oracle版本jdk版本推薦jar包備注Oracle 8iJDK 1.1.xclasses111.zip Oracle 8iJDK 1.1.xclasses12.zip Oracle 9iJDK 1.1.xclasses111.ja…

JSP特點

1.JSP文件必須在JSP服務器內運行。 2.JSP文件必須生成servlet才能執行。 3.JSP頁面的第一個訪問者速度慢,因為需要編譯生成Servlet。 4.JSP不需要專門的客戶端,也不需要java運行環境,因為JSP輸出到頁面是標準的HTML文件。

35--用兩個棧實現隊列

1.問題描述 用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 ) 示例 1: 輸入&#xf…