У меня есть иерархическая структура в том смысле, что может быть компания и пользователь, где компания может быть вложена в другую компанию, в то время как пользователи могут быть независимыми или принадлежать компании. Есть ли какая-либо документация о том, как использовать пользовательскую модель django в сочетании с пакетом django-mptt?Расширение модели пользователя django с использованием Django-mppt
ответ
Django documentation: Customizing authentication in Django рекомендует следующие параметры:
- Написать модель с отношением один-к-одному с моделью пользователя (Extending the User model):
Есть два способа продлить по умолчанию, без замены вашей собственной модели. Если требуемые изменения являются чисто поведенческими и не требуют каких-либо изменений в том, что хранится в базе данных, вы можете создать прокси-модель на основе User. Это позволяет использовать любые функции, предлагаемые прокси-моделями, включая заказ по умолчанию, пользовательские менеджеры или настраиваемые модели.
Если вы хотите хранить информацию, связанную с пользователем, вы можете использовать взаимно-однозначное отношение к модели, содержащей поля для получения дополнительной информации. Эта модель «один-к-одному» часто называется моделью профиля, поскольку она может хранить информацию, не связанную с auth, о пользователе сайта.
- Provide a custom user model для вашего проекта:
Некоторых виды проектов могут иметь требование проверки подлинности, для которых Django встроенной в модели пользователя не всегда уместна. Например, на некоторых сайтах имеет смысл использовать адрес электронной почты в качестве идентификационного токена вместо имени пользователя.
Оба вышеуказанного могут наследовать от MPTTModel
и решить вашу проблему. Я лично рекомендовал бы первый подход как более простой, и мне кажется, что этого будет достаточно для того, что вы описываете, но это снова зависит от ваших конкретных будущих потребностей.
Я думаю, что вы описываете на самом деле две разные проблемы. Модель вашей компании должна быть иерархической, но это не значит, что модель пользователя также должна быть. Вы бы, наверное:
class Company(<mpttmodel>):
pass
class YourUser(User):
company = models.ForeignKey(null=True)
В противном случае, если YourUser наследуется FRM модель mptt вы будете иметь вашу пользовательскую модель иерархического вместо модели компании.