Примечание. Если у вас возникнет соблазн ответить на этот вопрос, сказав мне, что вам не нравится django.contrib.auth, пожалуйста, продолжайте. Это не поможет. Я хорошо осведомлен о разбросе и силе мнений по этому вопросу.
Теперь вопрос:
Соглашение заключается в создании модели UserProfile с OneToOne для пользователя.
Насколько я могу придумать, более эффективным и действенным подходом является создание подкласса User для класса, который предполагается использовать для каждого человека в системе, — класса, называемого, скажем, Person(User).
Я не видел вразумительного объяснения, почему первое считается обычным, а второе считается хаком. Некоторое время назад я перешел на подход OneToOne, чтобы получить возможность использовать get_profile(), и с тех пор жалею об этом. Я думаю вернуться назад, если меня не заставят понять преимущества этого подхода.