Django的models操作
?
一、先看單表操作
增
方式1:
models.book.objects.create(Book_name = "aaa",Book_info = "bbb",Book_price = "ccc",Book_num = "ddd")
方式2:用2個(gè)*號(hào)傳遞一個(gè)字典進(jìn)去
book_info = {"Book_name":"aaa","Book_info":"bbb","Book_price":"ccc","Book_num":"ddd"}models.book.objects.create(**book_info)
刪,通過(guò)delete方法
可以通過(guò)表中的每個(gè)字段進(jìn)行刪除
models.book.objects.filter(id=1).delete()models.book.objects.filter(Book_name="book1").delete()
改,通過(guò)update方法,要 調(diào)用update方法,必須要querySet對(duì)象才可以,比如filter和all方法返回的是一個(gè)對(duì)象集合,通過(guò)get方法返回的單個(gè)對(duì)象是不能調(diào)用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方法:返回單個(gè)對(duì)象
models.book.objects.all().get(id=2)
filter方法:返回一個(gè)對(duì)象集合
models.book.objects.filter(id=1)
values方法:返回一個(gè)對(duì)象集合的字典形式,也可以只返回指定的字段
models.book.objects.filter(id=1).values("Book_name","Book_info")print(models.book.objects.all().values())
values_list方法:返回一個(gè)對(duì)象集合的列表的形式
print(models.book.objects.all().values_list())
count方法:統(tǒng)計(jì)數(shù)據(jù)的個(gè)數(shù)
print(models.book.objects.filter(Book_name="book3").count())
exists方法:統(tǒng)計(jì)對(duì)象集合中是否有數(shù)據(jù),有則為ture,無(wú)則為false
print(models.book.objects.filter(Book_name="book3").count())
exclude:返回不符合某個(gè)條件的對(duì)象集合
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加一個(gè)符號(hào)的效果一樣,逆序排列
models.book.objects.reverse("id")
distanct:對(duì)結(jié)果去重,這里不能對(duì)單個(gè)字段去重,只能對(duì)所有的字段去重
models.book.objects.all().distinct()
?
二、在看一對(duì)多操作
一對(duì)多和一對(duì)一基本上一樣,只有插入數(shù)據(jù)這里有點(diǎn)不一樣
# 先看一對(duì)多# 我們先看下ForeignKey這個(gè)字段的值該如何插入# 雖然我們寫的的Book_pub,但是實(shí)際上在數(shù)據(jù)庫(kù)中存儲(chǔ)的字段是Book_pub_id,所以這里有兩種方式來(lái)搞# 如果我們知道書對(duì)應(yīng)的出版社的id,則可以直接用Book_pub_id賦值這個(gè)數(shù)字就可以了# Book_pub_id = 4## 我們還可以直接從數(shù)據(jù)庫(kù)取出出版社的對(duì)象,然后Book_pub賦值給一個(gè)出版社的對(duì)象就可以了# Book_pub = Publish的對(duì)象
另外一點(diǎn)不一樣的就是,如果在一所對(duì)應(yīng)的表中刪除數(shù)據(jù),那么會(huì)同步刪除多表中的包含該一的字段
比如書1的出版社是出版社1,書2的出版社是出版社1,那么如果我們?cè)诔霭嫔绫碇袆h除出版社1,那么不僅僅出版社表中的出版社1的數(shù)據(jù)會(huì)被刪除,書表中的書1和書2都會(huì)被同步刪除
?
我們看下一對(duì)多如何增加數(shù)據(jù)
?因?yàn)闀统霭嫔缡且粚?duì)多的關(guān)系,我們先獲取一個(gè)出版社對(duì)象
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)
我們查看數(shù)據(jù)庫(kù),已經(jīng)創(chuàng)建了2條數(shù)據(jù)
?
?下面我們看下一對(duì)多的刪除
我們先刪除出版社id為5的數(shù)據(jù),看下有什么效果
models.Publish.objects.filter(id=5).delete()
我們發(fā)現(xiàn)Publish中id為5的數(shù)據(jù)已經(jīng)被刪除
同樣在book表中,關(guān)聯(lián)publish表中id為5的數(shù)據(jù)也被刪除
?
我們?cè)诳聪聞h除book表中的數(shù)據(jù)
?
models.book.objects.filter(id=8).delete()
我們看到數(shù)據(jù)庫(kù)中已經(jīng)刪除這條數(shù)據(jù)
?
?
我們?cè)诳锤?/p>
我們?cè)趧?chuàng)建兩條數(shù)據(jù)
?
?先把book表中的數(shù)據(jù)更新
models.book.objects.filter(id=14).update(Book_name="python教程")
我們查看數(shù)據(jù)庫(kù)發(fā)現(xiàn)名稱已經(jīng)更改
我們?cè)趤?lái)嘗試下修改publish_id
?
models.book.objects.filter(id=14).update(Book_pub_id=1)
我們?cè)趤?lái)看數(shù)據(jù)庫(kù)
?
?發(fā)現(xiàn)已經(jīng)更改
我們最后來(lái)看下查
首先我們看正向查詢,正向查詢的意思就在有外鍵的表查詢
通過(guò)all方法查看
obj = models.book.objects.all()print(obj)
結(jié)果如下
?
查看某條數(shù)據(jù)的信息
obj = models.book.objects.filter(id=13)[0]print(obj.Book_Auther)print(obj.Book_pub)print(obj.Book_pub_id)
結(jié)果如下
?
?我們還可以通過(guò)兩個(gè)下劃線做跨表查詢
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)
結(jié)果如下
?
?
我們?cè)趤?lái)看逆向查詢,通過(guò)沒(méi)有外鍵的表查詢
1、先拿到一個(gè)對(duì)象,記住,這里不能使用對(duì)象集合,下面的例子,第一個(gè)obj是一個(gè)錯(cuò)誤的示范
obj = models.Auther.objects.filter(id=1)obj = models.Auther.objects.get(id=1)
2、通過(guò)set方法查詢,記住values里面的字段和正向查詢是一樣的
obj = models.Auther.objects.get(id=1)##print(obj.book_set.values("Book_name","Book_pub__Pub_name"))
我們看結(jié)果
?
?我們可以查詢某個(gè)出版社出版了幾本書
obj = models.Publish.objects.filter(id=1)[0]print(obj.book_set.all().count())
我們可以查看某個(gè)出版社出版的書的名稱
obj = models.Publish.objects.filter(id=1)[0]print(obj.book_set.all().count())print(obj.book_set.all().values("Book_name"))
三、再看多對(duì)多操作
?先看怎么創(chuàng)建多對(duì)多的關(guān)系
方式1,由django為我們創(chuàng)建第三張表
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)
結(jié)果
?
?
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)
結(jié)果
?
我們?cè)诳捶聪蛱砑?#xff0c;在沒(méi)有manytomanyfiled的表出發(fā)去執(zhí)行命令,需要一個(gè)_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)
結(jié)果
?
?
在看反向移除,也要用到_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)
結(jié)果如下
?
?
?
方式2、我們自己創(chuàng)建第三張表
class BookToAuther(models.Model):book = models.ForeignKey("book")auther = models.ForeignKey("Auther")
在看如何為多對(duì)多表中插入數(shù)據(jù),我們先看下第三張表由django為我們創(chuàng)建的表的情況
為一個(gè)書添加多個(gè)作者
# 獲取一個(gè)書的對(duì)象book_obj = models.book.objects.filter(id=1)[0]# 獲取2個(gè)作者的對(duì)象auther1 = models.Auther.objects.filter(id=1)[0]auther2 = models.Auther.objects.all().get(id=2)# 為這個(gè)書添加2個(gè)作者對(duì)象book_obj.Book_Auther.add(auther1,auther2)# 為這個(gè)書添加2個(gè)對(duì)象的另外一種方式book_obj.Book_Auther.add(*[auther1,auther2
?把a(bǔ)dd換成remove就是解除綁定
?
反向查詢這里,book是小寫的,就算你的book表是大寫的,這里也要變?yōu)樾?/p>
?
?
?
多對(duì)多,如果我們自己創(chuàng)建第三張表,那么就在第三表中對(duì)book和auther都寫上外鍵,就相當(dāng)于一個(gè)多對(duì)多,那么我們操作第三張表和一對(duì)多是一樣的
?
# 第二種方式創(chuàng)建多對(duì)多的第三張表class BookToAuther(models.Model): class BookToAuther(models.Model):book = models.ForeignKey("book")auther = models.ForeignKey("Auther")
?
?
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我們?cè)趤?lái)看下查詢的其他方法
1、切片操作
obj = models.book.objects.all()[0:1]print(obj)obj = models.book.objects.all()[0:10:2]print(obj)
結(jié)果如下
?
2、拿到指定書名對(duì)應(yīng)的出版社的名稱
# 先拿到書的對(duì)象,然后根據(jù)外鍵就獲取一表中的對(duì)象,然后根據(jù)這個(gè)對(duì)象就可以獲取另外一張表的的字段的信息obj = models.book.objects.filter(Book_name="shu2")[0].Book_pub.Pub_nameprint(obj)?
結(jié)果
?
?
3、拿到某個(gè)出版社出版的所有書的名稱,book_set返回的是一個(gè)query_set對(duì)象
# 先拿到出版社的對(duì)象,然后通過(guò)book_set方法拿到書這個(gè)表的內(nèi)容,然后通過(guò)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)結(jié)果
?
4、拿到id大于2的書的名稱和id
# 查詢id大于2的書的名稱obj = models.book.objects.filter(id__gt=2)print(obj.values("id","Book_name"))
結(jié)果如下
?
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])# 包含,區(qū)分大小寫obj = models.book.objects.filter(Book_name__contains="chuban")# 包含,不區(qū)分大小寫obj = models.book.objects.filter(Book_name__icontains="chuban")# 以什么開(kāi)頭,區(qū)分大小寫obj = models.book.objects.filter(Book_name__startwith="chuban")# 以什么開(kāi)頭,不區(qū)分大小寫obj = models.book.objects.filter(Book_name__istartwith="chuban")# 以什么結(jié)尾,區(qū)分大小寫obj = models.book.objects.filter(Book_name__endwith="chuban")# 以什么結(jié)尾,不區(qū)分大小寫obj = models.book.objects.filter(Book_name__iendwith="chuban")
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
關(guān)聯(lián)查詢
1、查詢書的名稱是shu0的出版社的信息,要求是通過(guò)出版社這張表去查,這個(gè)意思book表中的 book_name字段,因?yàn)槌霭嫔缰袥](méi)有外鍵,則只能通過(guò)表名去做跨表查詢
obj = models.Publish.objects.filter(book__Book_name="shu0")print(obj.all())
?
fiilter中可以有多個(gè)過(guò)濾的字段,這些過(guò)濾的字段通過(guò)逗號(hào)隔開(kāi),這幾個(gè)字段是取交集的
?
2、我們還可以通過(guò)書的表去查詢出版社的信息,那么這里就不能用表明,而是用在書中的外鍵的字段,因?yàn)闀谋碇杏型怄I,所有要用外鍵的字段去做跨表查詢
obj = models.book.objects.filter(Book_pub__Pub_name="chubanshe1")print(obj.all())
?
?
?
補(bǔ)充一個(gè)小點(diǎn),model的form驗(yàn)證
我們?cè)趍odels中創(chuàng)建表,可以選擇CharField,也可以選擇EmailField,但是如果我們選擇了EmailField,就算我們輸入的不是郵箱格式,我們也可以正常插入數(shù)據(jù),那么是不是這個(gè)字段沒(méi)有作用呢?
我們先看下例子吧
1、在model創(chuàng)建表
class test(models.Model):u = models.CharField(max_length=64,null=True)e = models.EmailField(max_length=12,null=True)
2、然后我們插入數(shù)據(jù)
2_1、create方法插入數(shù)據(jù)
models.test.objects.create(u="aaaa",e="111111")
可以插入成功
?
2_2、save方法插入數(shù)據(jù)
obj = models.test()obj.u = "2222"obj.e = "22222"obj.save()
可以插入成功
?
看起來(lái)這個(gè)EmailField確實(shí)沒(méi)有什么作用,其實(shí)不然,如果我們這樣搞的話,他就會(huì)校驗(yàn)數(shù)據(jù)的合法性,使用clear_fields方法,就可以校驗(yàn)合法性
obj = models.test()obj.u = "3333"obj.e = "3333"res = obj.clean_fields()print(res)obj.save()
?我們看到后臺(tái)報(bào)錯(cuò)了
?
?數(shù)據(jù)庫(kù)中也沒(méi)有插入數(shù)據(jù)
如果我們輸入正確的郵箱格式,則可以添加成功
obj = models.test(u="33333",e="33333@qq.com")res = obj.clean_fields()print(res)obj.save()
數(shù)據(jù)庫(kù)也插入數(shù)據(jù)成功
?
?
先簡(jiǎn)單的介紹下model的forms,就到此為止吧
?
轉(zhuǎn)載于:https://www.cnblogs.com/bainianminguo/p/9069876.html
總結(jié)
以上是生活随笔為你收集整理的Django的models操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vscode里面如何配置库_VSCode
- 下一篇: python仿真智能驾驶_基于Pytho