cron это "функция" linux систем запускать задачи по расписанию. Максимально "примитивная". Сказал ей "дергать [filename].py [каждый день в 6]/[каждые 15 минут]" (условно), она будет это делать.
celery же это библиотека на python, которая позволяет:
- делать то-же самое, но непосредственно в коде (что позволяет абстрагироваться от ОС).
- Добавлять "задачи" в очередь задач, что позволяет выполнить код, не ожидая завершения какого-либо процесса.
Зачем нужно второе? Например для загрузки больших файлов. Если делать в основном теле вьюхи то велик шанс словить timeout error. Поэтому, основные данные сохраняются в основном теле, а файл загружается в отдельной задаче.
Также, можно использовать для работы с внешними сервисами, например почтовыми. Тут ситуация примерно такая-же, как и с файлами: хочешь послать email, но сервер долго не отвечает - лови timeout.