쉬운 수정은 원래 업데이트를 수행 한 다음 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()
절약의 첫 번째 업데이트를 방지이 뭔가가 두 번째 업데이트에서 잘못한다 데이터베이스 수준의 무결성을 보장하는 것입니다.
사용자 정의 관리자와 함께 사용자 정의 쿼리 세트 (즉, mppt.managers.TreeManager
)를 사용하는 방법에 대한 장고의 현재 버전에 대한 문서를 확인해야합니다.