?
一、先看單表操作
增
方式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,就到此為止吧
?