函數式語言特性:-迭代器和閉包 本章內容 閉包(closures) 迭代器(iterators) 優化改善 12 章的實例項目 討論閉包和迭代器的運行時性能 一、閉包(1)- 使用閉包創建抽象行為 什麼是閉包(closure) 閉包:可以捕獲其所在環境的匿名函數。 閉包: 是匿名函數 保存為變數、作 ...
本文首發於微信公眾號:Hunter後端
原文鏈接:Django筆記十九之manager用法介紹
首先介紹一下 manager 的使用場景,比如我們有一些表級別的,需要重覆使用的功能,都可以使用 manager 來實現。
比如我們在前面的筆記中介紹的 model 的 create()、update() 等方法,Blog.objects.create() 中前面的 objects 就是一種 manager,不過這是系統給我們定義的。
那麼我們也可以自己通過 manager 的方式來定義一些通用的函數方便我們在系統中使用。
- 定義 manager
- 使用 manager
- 通過 manager 更改原始的 QuerySet
1、定義 manager
定義的方式為創建一個繼承 models.Manager 的類,定義所需要的函數,然後在 model 里定義 objects 指向這個 Manager 即可:
class BlogManager(modls.Manager):
def test_func(self, *args, **kwargs):
# 執行一些操作
return
class Blog(models.Model):
objects = BlogManager()
2、使用 manager
假設我們想實現這樣一個功能,通過輸入一個 keyword,返回所有 name 欄位包含 keyword 的數據的總數。
不使用 manager 的話,我們大概每次都會這樣來操作:
keyword = "python"
count = Blog.objects.filter(name__icontains=keyword)
如果是使用 manager 來實現,則可以先定義這個函數:
class BlogManager(models.Manager):
def contain_keyword_count(self, keyword):
return self.filter(name__icontains=keyword).count()
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
objects = BlogManager()
那麼通過 Manager 來操作便是:
keyword = "python"
count = Blog.objects.contain_keyword_count(keyword)
註意,這裡指向 BlogManager 的變數,我們與系統預設的 objects 保持了一致,我們可以定義為其他名稱,不過調用的時候,需要改成其他的形式即可,比如:
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
blog_objects = BlogManager
Blog.blog_objects.contain_keyword_count(keyword)
3、通過 manager 更改原始的 QuerySet
有一些底層的 QuerySet 的函數我們也可以通過 manager 的形式來繼承修改,比如 get_queryset(),其他的比如 filter()、exclude()、all() 在底層都會調用這個函數。
現在我們來通過 manager 改寫這個函數:
class BlogManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(name__icontains="python")
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
objects = models.Manager()
blog_objects = BlogManager()
然後當我們調用下麵的:
Blog.objects.all()
Blog.blog_objects.all()
則會是兩個結果,第一個返回的是原始的 all() 的結果,第二條則是我們定義了經過篩選的結果。
註意:blog_objects 和原來的 objects 一樣,可以在原來的基礎上進行其他的篩選操作,比如:
Blog.blog_objects.filter(tagline='xxx')
以上只是簡單介紹了 manager 的使用方法,我們可以往 manager 的函數里添加更多複雜的功能函數,這個可以根據需要添加。
以上就是本篇筆記的全部內容,下一篇筆記我們將介紹 migration 的命令和手動增加 migration 文件。
如果想獲取更多相關文章,可掃碼關註閱讀: