2014-04-09 36 views
0

我有自定義保存其檢查我的對象的「活動」字段的值爲2()方法,然後給出相同數量的所有後代字段(使用MPTTDjango的自定義的保存方法和更新

def save(self): 
    if self.active == 2: 
    self.get_descendants().update(active=2) 

    super(Post, self).save() 

現在,當我更新()我的模型時,我想要此代碼也可以工作。我應該嘗試製作自定義更新方法嗎?怎麼做?

回答

1

一個簡單的修復方法是執行原始更新,然後使用get_queryset_descendants()爲所有後代執行附加更新。完整的代碼會是這樣的:

qs = <some queryset> 
qs.update(**values) 
descendants = MyModel.objects.get_queryset_descendants(qs.filter(active=2)) 
descendants.update(active=2) 

或者,如果你只是想更新active屬性,它可以在一個單一的去完成:

qs = <some queryset> 
descendants = MyModel.objects.get_querset_descendants(qs, include_self=True) 
descendants.update(active=2) 

這當然可以被包裹在update功能。這將是這樣的:

from django.db import transaction 
from django.db.models.query import QuerySet 

class MyModelQuerySet(QuerySet): 
    def update(self, **kwargs): 
     with transaction.atomic(): # for Django >= 1.6 
     ####### OR ###### 
     with transaction.commit_on_succes(): # for Django <= 1.5 
      r = super(MyModelQuerySet, self).update(**kwargs) 
      descendants = self.model.objects.get_query_set_descendants(self.filter(active=2)) 
      descendants.update(active=2) 
     return r 

with transaction.atomic()with transaction.commit_on_succes()防止保存第一次更新,如果第二個更新失敗,這是爲了保證在數據庫級別應該什麼出差錯在第二次更新的完整性。

您應該檢查當前版本Django的文檔,瞭解如何將自定義查詢集用於自定義管理器(即mppt.managers.TreeManager)。

相關問題