Как сделать отделный домен для каждого юзера?
https://nginx.org/ru/docs/http/server_names.html
Специальное имя с маской вида “.example.org” соответствует как точному имени “example.org”, так и маске “*.example.org”.
Дальше разруливаете на уровне приложения.
Я бы сделал так:
1. Как сказали выше example.org ставится nginx'у как условие направления запросов в приложение. Т.е. любой pupkin.example.org и ivanov.example.org уйдут в Джанго на обработку.
2. Создал модель Company в базе данных с индексируемым полем domain.
3. Сделал мидлварь, которая наподобие мидлвари ванильной авторизации выковыривает хост из  request.META, лезет в базу, находит объект компании и прикрепляет его к запросу setattr(request, 'company', company_instance)
, после этого объект компании можно будет юзать во вьюхах, так же как и юзера: request.company
4. В случае если в имени хоста нету домена третьего уровня, то я бы сделалsetattr(request, 'main_site', True)
 чтобы во вьюхе можно было понять что это основной сайт, а если поддомен передан, но в базе его нет, то я бы сразу вернул редирект на страницу с инфой, что такой компании не существует, или она заблокирована, или еще что, зарегистрируйтесь и будет вам счастье.
5. Автоматическое создание поддомена это лишь создание Company.objects.create(
    owner=some_user,
    domain=company_domain,
    email=company_email,
    ...
    created=timezone.now()
)
, вопрос только в том, будет ли company_domain генерироваться согласно какому-то принципу, или задаваться админом, или юзером при регистрации, или с потолка или рандом, вариантов как звезд на небе, а вопрос слишком обширный, типа "я хочу сделать сайт как фейспук, шо мне делать".