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