Сначала я начал свой UserProfile следующим образом:
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
verified = models.BooleanField()
mobile = models.CharField(max_length=32)
def __unicode__(self):
return self.user.email
Что хорошо работает с AUTH_PROFILE_MODULE = 'accounts.UserProfile'
, установленным в settings.py
.
Тем не менее, у меня есть два разных типа пользователей на моем веб-сайте, индивидуальные и корпоративные, каждый из которых имеет свои уникальные атрибуты. Например, я хотел бы, чтобы у моих индивидуальных пользователей был только один пользователь, поэтому он имел user = models.OneToOneField(User)
, а для Corporate я хотел бы, чтобы у них было несколько пользователей, связанных с одним и тем же профилем, поэтому вместо этого я имел бы user = models.ForeignKey(User)
.
Поэтому я подумал о разделении модели на две разные модели: IndivProfile
и CorpProfile
, оба наследуемые от UserProfile
, перемещая атрибуты, специфичные для модели, в соответствующие подмодели. Мне кажется хорошей идеей и, вероятно, будет работать, однако я бы не смог указать AUTH_PROFILE_MODULE
таким образом, так как у меня есть два профиля пользователей, которые бы отличались для разных пользователей.
Я также думал о том, чтобы делать это наоборот, имея UserProfile
наследование от нескольких классов (моделей), примерно так:
class UserProfile(IndivProfile, CorpProfile):
# some field
def __unicode__(self):
return self.user.email
Таким образом, я бы установил AUTH_PROFILE_MODULE = 'accounts.UserProfile'
и решил проблему. Но это не похоже на то, что он будет работать, поскольку наследование в python работает слева направо, и все переменные в IndivProfile
будут доминировать.
Конечно, у меня всегда может быть одна модель с переменными IndivProfile
и CorpProfile
, которые все смешиваются вместе, а затем я буду использовать необходимые, где это необходимо. Но это просто не выглядит чистым для меня, я бы предпочел, чтобы они были разделены и использовали подходящую модель в соответствующем месте.
Любые предложения по чистым образом?