2014-04-09 2 views
0

내 객체의 "활성"필드가 동일한 2 체크() 메소드를 저장하고, 모든 자손 필드에 같은 번호를 알려 업데이트장고 저장 방법 사용자 정의 내가 정의있어

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

    super(Post, self).save() 

지금 나는이 코드 작업을 내가 update() 할 때도 원한다. 사용자 지정 업데이트 방법을 만들어야합니까? 그것을하는 방법?

답변

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() 절약의 첫 번째 업데이트를 방지이 뭔가가 두 번째 업데이트에서 잘못한다 데이터베이스 수준의 무결성을 보장하는 것입니다.

사용자 정의 관리자와 함께 사용자 정의 쿼리 세트 (즉, mppt.managers.TreeManager)를 사용하는 방법에 대한 장고의 현재 버전에 대한 문서를 확인해야합니다.

관련 문제