code: def chunkify(iterable, chunksize):
      
      from .queryset import QuerySet
      if hasattr(iterable, '__getitem__') and not isinstance(iterable, QuerySet):
          # tuple, list. QuerySet has __getitem__ but that evaluates the entire query greedily. We don't want that here.
          for i in range(0, len(iterable), chunksize):
              yield iterable[i:i + chunksize]
      else:
          # generator, set, map, QuerySet
          chunk = []
          for i in iterable:
              chunk.append(i)
              if len(chunk) == chunksize:
                  yield chunk
                  chunk = []
          if chunk:
              yield chunk
docs: Splits an iterable into chunks of size ``chunksize``. The last chunk may be smaller than ``chunksize``.