一個簡單的修復方法是執行原始更新,然後使用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
)。