def chunk_queryset(queryset, chunk_size=20): ordered_queryset = queryset.order_by("-pk") # bias to newest items first chunk = ordered_queryset[:chunk_size] while chunk: last_pk = None for item in chunk: last_pk = item.pk yield item chunk = ordered_queryset.filter(pk__lt=last_pk)[:chunk_size]