Как в django брать записи из модели друг за другом не исполюзуя .all()?
Добавьте к первой модели булевое поле, типа is_processed
Делайте выборку по нему .filter(is_processed=False), получая порцию данных, к примеру .first() или делая срез, и  устанавливая флаг после обработки у обработанных инстансов.
Повторяете предыдущий шаг, пока не выставите все флаги.
одна задача в celery бежит по всем записям и если необходимо создает много маленьких задач в том же celery
тоесть Ваша задача просто превращается в задачу-диспетчер, а вся логика для конкретной записи укладывается в этой маленькой задаче. желательно эти маленьки задача выделить в отдельный воркер, с большим значением concurensy