譯 合理使用標準MODEL MANAGER

2021-09-03 08:24:11 字數 4049 閱讀 1486

乙個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...