1313from .graph import ComputedModelsGraph , ComputedFieldsException , Graph , ModelGraph , IM2mMap
1414from .helpers import proxy_to_base_model , slice_iterator , subquery_pk , are_same
1515from . import __version__
16+ from .signals import resolver_start , resolver_exit , resolver_update
1617
1718from fast_update .fast import fast_update
1819
@@ -391,7 +392,8 @@ def update_dependent(
391392 update_fields : Optional [Iterable [str ]] = None ,
392393 old : Optional [Dict [Type [Model ], List [Any ]]] = None ,
393394 update_local : bool = True ,
394- querysize : Optional [int ] = None
395+ querysize : Optional [int ] = None ,
396+ _is_recursive : bool = False
395397 ) -> None :
396398 """
397399 Updates all dependent computed fields on related models traversing
@@ -472,6 +474,8 @@ def update_dependent(
472474
473475 updates = self ._querysets_for_update (_model , instance , _update_fields ).values ()
474476 if updates :
477+ if not _is_recursive :
478+ resolver_start .send (sender = self )
475479 with transaction .atomic (): # FIXME: place transaction only once in tree descent
476480 pks_updated : Dict [Type [Model ], Set [Any ]] = {}
477481 for queryset , fields in updates :
@@ -483,6 +487,8 @@ def update_dependent(
483487 pks , fields = data
484488 queryset = model2 .objects .filter (pk__in = pks - pks_updated .get (model2 , set ()))
485489 self .bulk_updater (queryset , fields , querysize = querysize )
490+ if not _is_recursive :
491+ resolver_exit .send (sender = self )
486492
487493 def bulk_updater (
488494 self ,
@@ -560,11 +566,20 @@ def bulk_updater(
560566 if change :
561567 self ._update (model ._base_manager .all (), change , fields )
562568
569+ if pks :
570+ resolver_update .send (sender = self , model = model , fields = fields , pks = pks )
571+
563572 # trigger dependent comp field updates from changed records
564573 # other than before we exit the update tree early, if we have no changes at all
565574 # also cuts the update tree for recursive deps (tree-like)
566575 if not local_only and pks :
567- self .update_dependent (model ._base_manager .filter (pk__in = pks ), model , fields , update_local = False )
576+ self .update_dependent (
577+ instance = model ._base_manager .filter (pk__in = pks ),
578+ model = model ,
579+ update_fields = fields ,
580+ update_local = False ,
581+ _is_recursive = True
582+ )
568583 return set (pks ) if return_pks else None
569584
570585 def _update (self , queryset : QuerySet , change : Sequence [Any ], fields : Sequence [str ]) -> Union [int , None ]:
0 commit comments