1. 如何通過Django的Model操作數據庫?
在Django的Model中,QuerySet是一個很重要的概念。因為我們同數據庫的所有查詢以及更新交互都是通過它來完成的。
2. Django的Model是如何提供提數據的?
在model中,Django通過給Model增加一個objects屬性來提供數據操作大的接口。比如:想要查詢所有文章的數據,可以這么寫:
1 Post.objects.all()
這樣一來就能拿到QuerySet對象。這個對象中包括了我們需要的數據,當我們用到它時,他才會去數據庫中獲取數據。
3. 為什要這樣?
原因:QuerySet支持鏈式調用。如果每次執行都要查詢數據庫的話,會存在性能問題。 舉個例子:
1 post = Post.objects.all() 2 available_posts = Posts.filter(status=1)
如果這條語句要執行的話,先執行Post.objects.all(),拿到所有的數據posts,然后再執行過濾,拿到所有status=1的available_posts,這樣就會產生兩次數據庫請求,並且兩次查詢存在重復的數據。
一般來說,平時寫不出這樣的語句,但是當代碼比較復雜時,可能會出現這樣的問題。
4. 對QuerySet的理解
因此,Django中的QuerySet本質上是一個懶加載的對象。以上的兩行代碼執行之后,都不會產生數據庫查詢操作,只是會返回一個QuerySet對象,等你真正用到它的時候才會執行查詢。
代碼解釋:
1 post = Post.objects.all()#返回一個QuerySet對象並賦值給posts 2 available_posts = Posts.filter(status=1)#繼續返回一個QuerySet對象並賦值給available_posts 3 4 print(available_posts)#此時會根據上邊的兩個條件執行數據查詢操作,對應的SQL語句為:SELECT * FROM blog_post where status =1;
4. 什么又是鏈式調用呢?
執行一個對象中的方法之后得到的結果還是這個對象,這樣可以接着執行對象上面的其他方法,這就是鏈式調用。
舉例:
1 posts = Post.objects.filter(status=1).filter(category_id=2).filter(title__icontains="xxx")
這是一種良好的編程方式,對數據處理更加自然。類似於管道與水流的關系,數據就是水流,而管道就是方法,把不同的管道連接起來形成“鏈”,然后讓數據流過。