2013-12-25 2 views
0

В настоящее время я использую пользовательские модели Django 1.5. Используя мой код ниже, как я могу добавить нового пользователя второго типа?Пользовательские пользователи Django Добавление второй модели пользователя

Я хочу, чтобы добавить нового пользователя, как называется StandardUser У меня уже есть CompanyUser типа т.е.

class StandardUser(AbstractEmailUser): 
    class Meta: 
     app_label = 'accounts' 

Но это не похоже на работу, как я могу добиться этого?

Текущий код ниже:

class AbstractEmailUser(AbstractBaseUser, PermissionsMixin): 
    """ 
    Abstract User with the same behaviour as Django's default User but 
    without a username field. Uses email as the USERNAME_FIELD for 
    authentication. 

    Use this if you need to extend EmailUser. 

    Inherits from both the AbstractBaseUser and PermissionMixin. 

    The following attributes are inherited from the superclasses: 
     * password 
     * last_login 
     * is_superuser 
    """ 
    email = models.EmailField(_('email address'), max_length=255, 
           unique=True, db_index=True) 
    is_staff = models.BooleanField(_('staff status'), default=False, 
     help_text=_('Designates whether the user can log into this admin ' 
        'site.')) 
    is_active = models.BooleanField(_('active'), default=True, 
     help_text=_('Designates whether this user should be treated as ' 
        'active. Unselect this instead of deleting accounts.')) 
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 

    objects = EmailUserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [] 

    class Meta: 
     abstract = True 

class CompanyUser(AbstractEmailUser): 
    company = models.CharField(max_length=100) 

    class Meta: 
     app_label = 'accounts' 

ответ

1

Вы можете иметь только один 'официальный' модель пользователя в проекте:
https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#substituting-a-custom-user-model

Я предлагаю вам организовать это так:

class StandardUser(AbstractEmailUser): 
    class Meta: 
     app_label = 'accounts' 

class CompanyUser(StandardUser): 
    company = models.CharField(max_length=100) 

    class Meta: 
     app_label = 'accounts' 

и в settings.py

AUTH_USER_MODEL = 'myapp.StandardUser' 

Другими словами каждый CompanyUser имеет связанный с ним StandardUser через авто OneToOneField согласно модели наследования Джанго.

Этот подход сродни Object composition, и я думаю, что это, вероятно, единственный подход, который будет работать в Django.

Это означает, что для того, чтобы запрашивать пользователей без компании, вы должны сделать что-то вроде:

StandardUser.objects.filter(companyuser=None)

(вы можете захотеть custom queryset manager для этого

Вероятно, если идти по этому маршрутизировать AbstractEmailUser класс больше не нужен, вы можете переименовать его и сделать свой конкретный класс StandardUser.

Смежные вопросы