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