2015-05-05 36 views
-1

我瞭解在列出或過濾數據時Django中Managers的作用。然而,當涉及到節約模式我經常看到用以下兩種方式的數據...如何使用管理器在Django中保存數據

使用經理:

class Project(TimeStampedModel): 
    stuff 

    def save(self, **kwargs): 
     Action.objects.log_action(user=self.user,comment="Saves a project") 

不使用經理:

class Project(TimeStampedModel): 
    stuff 

    def save(self, **kwargs): 
     action = Action(user=self.user,comment="Saves a project") 
     action.save 

所以我的問題是,鑑於上述情況是正確的?

回答

1

我相信這兩者都很好。但是,我更願意抽象所有業務邏輯,以至於我們甚至不必知道如何記錄行動。

當調用log_action時,我隱藏了應該在什麼時候傳遞的實現細節。

如果我沒有使用log_action,我可能會忘記在我的代碼中的某處,我可能會將該對象保存在不同的邏輯中。

因此,回到你的問題,我相信這不是使用管理器來保存數據,而是如何抽象業務邏輯。

+0

那麼在上面的情況下,你會使用管理器選項? – Prometheus

+1

是的,:-)如果您的項目中有其他模型需要'log_action',那麼如果您沒有在管理器中抽象出該模型,那麼該模型必須複製'log_action'邏輯。 – Yeo

1

管理人員是爲類級別的東西。保存是一個實例級別的操作。

你打電話給什麼save實際上有一個創建行動,這已經由Manager類默認提供。

+0

因此,如果Django有''Model.objects.create()''他們使用管理器來保存? – Prometheus

+1

當你調用['create()'Queryset method](https://github.com/django/django/blob/1.8c1/django/db/models/query.py#L341-L349)時,它會調用[ 'save()模型方法'](https://github.com/django/django/blob/1.8c1/django/db/models/base.py#L654-L748),它在表格插入中完成繁重的工作。 – Yeo

相關問題