Надеюсь, что все это имеет смысл:) Я уточню, если это необходимо, в комментариях. Кроме того, я экспериментирую с использованием жирного текста в этом вопросе и отредактирую его, если я (или вы) нахожу его отвлекающим. С этим с дороги...
Использование django.contrib.auth дает нам User и Group, среди других полезных вещей, с которыми я не могу обойтись (например, базовые сообщения).
В моем приложении у меня есть несколько разных типов пользователей. Пользователь может иметь только один тип. Это будет легко обрабатываться группами с небольшой осторожностью. Однако эти разные пользователи связаны друг с другом в иерархиях/отношениях.
Посмотрите на этих пользователей: -
Принципалы - пользователи верхнего уровня
Администраторы - каждый администратор сообщает Принципалу
Координаторы - каждый координатор отчитывается перед Администратором
Помимо этих существуют другие типы пользователей, которые напрямую не связаны с, но могут быть связаны позже. Например, "Компания" является другим типом пользователя и может иметь различные "Продукты", а продукты могут контролироваться "Координатором". "Покупатель" - это другой вид пользователя, который может покупать продукты.
Теперь все эти пользователи имеют различные другие атрибуты, некоторые из которых являются общими для всех типов пользователей, а некоторые из них отличаются только одним типом пользователя. Например, все типы пользователей должны иметь адрес. С другой стороны, только основной пользователь принадлежит к "BranchOffice".
Еще одна точка, о которой говорилось выше, заключается в том, что Пользователь может быть только одного типа.
Приложение также должно отслеживать, кто создал и/или изменил Принципов, Администраторов, Координаторов, Компаний, Продуктов и т.д.. (Так что еще две ссылки на модель пользователя.)
В этом случае целесообразно использовать наследование нескольких таблиц Django следующим образом: -
from django.contrib.auth.models import User
class Principal(User):
#
#
#
branchoffice = models.ForeignKey(BranchOffice)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalmodifier")
#
#
#
Или мне нужно делать это так: -
class Principal(models.Model):
#
#
#
user = models.OneToOneField(User, blank=True)
branchoffice = models.ForeignKey(BranchOffice)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalmodifier")
#
#
#
Пожалуйста, имейте в виду, что существуют другие типы пользователей, связанные с внешними ключами, например: -
class Administrator(models.Model):
#
#
#
principal = models.ForeignKey(Principal, help_text="The supervising principal for this Administrator")
user = models.OneToOneField(User, blank=True)
province = models.ForeignKey( Province)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="administratorcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="administratormodifier")
Мне известно, что Django использует отношения "один-к-одному" для наследования нескольких таблиц за кулисами. Я просто недостаточно квалифицирован, чтобы решить, какой из них более разумный.