乙個manager本質上來說,就是乙個提供給django model的資料庫訪問介面。對於django應用程式中的每個model都至少存在乙個manager。
每個model有乙個預設的manager "objects",這也是每個model訪問資料庫的預設介面。
在本文中,我們使用employees用例來進行說明。
from django.db import models
class employee(models.model):
*** = (('m', 'male'), ('f', 'female'))
departments = (
('sales', 'sales'),
('marketing', 'marketing'),
('finance', 'finance'),
('engineering', 'engineering'),
)roles = (
('j', 'junior'),
('s', 'senior'),
('m', 'manager'),
)first_name = models.charfield(max_length=120)
last_name = models.charfield(max_length=120)
email = models.charfield(max_length=200)
gender = models.charfield(max_length=1, choices=***)
department = models.charfield(max_length=120, choices=departments, null=true)
role = models.charfield(max_length=120, choices=roles, default='j')
salary = models.floatfield()
def __unicode__(self):
return self.first_name + self.last_name
如果你想使用「objects「作為乙個欄位名稱,或者僅僅想使用其他名字來作為manager,你可以簡單的對manager重新命名就可以。重新命名manager的方法,就是在model中定義乙個modelsmanager()型別的類屬性。
from django.db import models
class employee(models.model):
# custom manager replaces objects manger
all_employees = models.manager()
*** = (('m', 'male'), ('f', 'female'))
departments = (
('sales', 'sales'),
('marketing', 'marketing'),
('finance', 'finance'),
('engineering', 'engineering'),
)roles = (
('j', 'junior'),
('s', 'senior'),
('m', 'manager'),
)first_name = models.charfield(max_length=120)
last_name = models.charfield(max_length=120)
email = models.charfield(max_length=200)
gender = models.charfield(max_length=1, choices=***)
department = models.charfield(max_length=120, choices=departments, null=true)
role = models.charfield(max_length=120, choices=roles, default='j')
salary = models.floatfield()
def __unicode__(self):
return self.first_name + self.last_name
在上述例子中,employee.objects會產生乙個attributeerror異常,但是employee.all_employees.all()會返回所有person物件的列表。
在乙個特定的model中,你可以使用某些常見的manager以對預設manager的功能進行擴充套件。
這個功能在下面展示的"dry"原則中益處良多。可以看到,通過書寫合適的manager,我們可以避免重複的書寫過濾條件。
from django.db import models
class senioremployeemodelmanager(models.manager):
def get_queryset(self):
return super(senioremployeemodelmanager, self).get_queryset().filter(role='s')
class managersmodelmanager(models.manager):
def get_queryset(self):
return super(managersmodelmanager, self).get_queryset().filter(role='m')
class employee(models.model):
# custom managers replaces objects manger
all_employees = models.manager()
all_senior_employees= senioremployeemodelmanager()
all_managers = managersmodelmanager()
*** = (('m', 'male'), ('f', 'female'))
departments = (
('sales', 'sales'),
('marketing', 'marketing'),
('finance', 'finance'),
('engineering', 'engineering'),
)roles = (
('j', 'junior'),
('s', 'senior'),
('m', 'manager'),
)first_name = models.charfield(max_length=120)
last_name = models.charfield(max_length=120)
email = models.charfield(max_length=200)
gender = models.charfield(max_length=1, choices=***)
department = models.charfield(max_length=120, choices=departments, null=true)
role = models.charfield(max_length=120, choices=roles, default='j')
salary = models.floatfield()
def __unicode__(self):
return self.first_name + self.last_name
在這個例子中,建立了兩個普通的manager:"all_senior_employees", "all_managers".
employee.all_senior_employees.all()返回所有高階雇員的資訊列表,而employee.all_managers則返回所有管理人員的列表。
作為乙個常見的例子,在某些複雜的model中,我們可以採用類似的技術。
合理使用索引
索引是資料庫中重要的資料結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用ibm最先提出的isam索引結構。索引的使用要恰到好處,其使用原則如下 在經常進行連線,但是沒有指定為外來鍵的列上建立索引,而不經常連線的字段則由優化器自動生成索引。在頻繁進行排序或分組 即進行group b...
合理使用快取
乙個優秀的專案,其中必然使用到了快取機制 乙個 遇到效能瓶頸是,第乙個解決方案一般是使用快取,快取的應用面特別廣,無論是客戶端,還是應用伺服器,或是儲存伺服器。快取一般存放讀寫比價頻繁,變化較少的資料,應用程式讀取資料時先從快取中讀取資料,獲取不到再訪問資料庫,再放到快取中,以便於下次快速獲取。快取...
合理使用Blob Clob
用了十多年的資料庫,工作需要也經常要幫忙資料庫效能調優。這裡簡單列一些我平時工作時用資料庫的體會和心得 介紹 雖然資料庫原生支援blob 二進位製大物件 和clob 字串大物件 但是從效能的考慮,我們把這些內容放在資料庫裡面不合適的。比如說我有1個100多m的 blob 或者說我有一大段文字 clo...