2015-10-02 3 views
0

Благодаря моему приложении requeriments мне нужна иерархия классов пользователей, как:Расширение Джанго пользователя с подклассами

class CommonUser(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE) 
    photo = models.ImageField(upload_to="profileImages",blank=True,null=True) 
    #HERE: Common properties for every user 
    class Meta: 
     abstract = True 

class Installer(CommonUser): 
    #HERE: Specific properties for Installer Companies 


class Administration(CommonUser): 
    #HERE: Specific properties for Administration 


class Client(CommonUser): 
    #HERE: Specific properties for Clients 

Ну, в view.py мне нужно, чтобы получить изображение профиля для пользователя. Я получаю пользователя по запросу, поэтому у меня есть объекты models.User, и я не знаю, к чему класс принадлежит. Я не в состоянии сделать:

request.user.commonuser.photo

, потому что объект пользователя оленья кожа имеет никакого отношения OnetoOne с commonuser но с монтажником/администрирования/клиента ...

Любая идея? Благодаря!

+0

Один из подходов может быть создание поля для CommonUser как is_administration, is_client, is_installer со значением по умолчанию Ложный и установить их верно, когда вы создаете объект этот тип. –

+0

Возможно, вы хотите думать об этом как о профиле, а не о пользователе. –

ответ

1

Я на мобильном телефоне, так что я не могу проверить это, но ...

Я бы поставил «related_name» на своем поле CommonUser.user под названием «commonuser». Тогда вы можете просто использовать:

request.user.commonuser.photo 

как и вы.

Я думаю, проблема заключается в том, что вы ссылаетесь на объект пользователя Django для ссылки на обратные отношения без имени.

0

Во-первых, я думаю, что эта модель является скорее профилем, чем пользователем. Если вы не возражаете использовать 1.9 (и postgres), то это прекрасная утилита для поля JSON. Вы можете фильтровать с регулярным поиском и не нужно указывать каждый тип. Таким образом, вы также можете расширить модель пользователя таким образом, чтобы пользователь мог выполнять сразу несколько ролей. Другая вещь, которую я думал было связывая его с точностью до наоборот:

class UserProfile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE) 
    # ... 

class Installer(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name='installer') 
    #HERE: Specific properties for Installer Companies 


class Administration(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name='admin') 
    #HERE: Specific properties for Administration 


class Client(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name='client') 
    #HERE: Specific properties for Clients 
Смежные вопросы