2015-10-02 116 views
0

Django的用户由于我的应用程序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

因为用户对象不必须与commonuser但安装程序/管理/客户端的任何OnetoOne关系......

任何想法?谢谢!

+0

一种方法可以为CommonUser创建领域,如is_administration,is_client,is_installer默认值假,并将其设置为true,当您创建的对象那种类型。 –

+0

你可能想把这些东西想象成配置文件而不是用户。 –

回答

1

我移动,所以我不能对此进行测试,但...

我会设置你的所谓的“commonuser” CommonUser.user领域的“related_name”。那么你可以使用:

request.user.commonuser.photo 

像你已经。

我认为问题在于你引用一个Django用户对象来引用没有正确名称的向后关系。

0

首先,我认为这个模型更像是一个Profile而不是User。如果你不介意使用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