Сначала я начал свой 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, которые все смешиваются вместе, а затем я буду использовать необходимые, где это необходимо. Но это просто не выглядит чистым для меня, я бы предпочел, чтобы они были разделены и использовали подходящую модель в соответствующем месте.
Любые предложения по чистым образом?