code: def get_children_graph(self, item_ids=None, language=None, forbidden_item_ids=None):
          
          if forbidden_item_ids is None:
              forbidden_item_ids = set()
  
          def _children(item_ids):
              if item_ids is None:
                  items = Item.objects.filter(active=True).prefetch_related('children')
              else:
                  item_ids = [ii for iis in item_ids.values() for ii in iis]
                  items = Item.objects.filter(id__in=item_ids, active=True).prefetch_related('children')
              return {
                  item.id: sorted([
                      _item.id for _item in item.children.all()
                      if _item.active and _item.id not in forbidden_item_ids
                  ])
                  for item in items if item.id not in forbidden_item_ids
              }
  
          if item_ids is None:
              return self._reachable_graph(None, _children, language=language)
          else:
              graph = self.get_children_graph(None, language, forbidden_item_ids=forbidden_item_ids)
              return self._subset_graph(graph, set(item_ids) - set(forbidden_item_ids))
docs: Get a subgraph of items reachable from the given set of items through
          the 'child' relation.
  
          Args:
              item_ids (list): items which are taken as roots for the reachability
              language (str): if specified, filter out items which are not
                  available in the given language
  
          Returns:
              dict: item id -> list of items (child items), root items are
              referenced by None key