日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django的models操作

發布時間:2023/12/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的Django的models操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。