def recache_n_events(keyword_ids, all=False): """ Recache the number of events for the given keywords (by ID). :param all: recache all keywords instead :type keyword_ids: Iterable[str] """ # needed so we don't empty the blasted iterator mid-operation keyword_ids = tuple(set(keyword_ids)) with transaction.atomic(): if all: Keyword.objects.update(n_events=0) else: # set the flag to false here, so zero-event keywords will get it too Keyword.objects.filter(id__in=keyword_ids).update(n_events=0, n_events_changed=False) for keyword_id, n_events in count_events_for_keywords(keyword_ids, all=all).items(): Keyword.objects.filter(id=keyword_id).update(n_events=n_events)