用子类扩展Django用户

2024-10-17 06:15:06 发布

您现在位置:Python中文网/ 问答频道 /正文

由于我的应用程序需求,我需要用户类的层次结构,如:

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

嗯,在视图.py我需要一个用户的个人资料图片。我通过请求获取用户,因此我有一个模型。用户对象和我不知道它属于女巫类。我不能做:

在请求.user.commonuser.照片

因为用户对象与commonuser没有任何一对一的关系,而是与安装程序/管理/客户端。。。在

有什么想法吗?谢谢!在


Tags: 对象用户true应用程序forheremodelsinstaller
2条回答

首先,我认为这种模式更像是一个个人资料而不是用户。如果您不介意使用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

我在手机上,所以我不能测试这个,但是。。。在

我会在你的普通用户.user名为“普通用户”的字段。然后您可以使用:

request.user.commonuser.photo

就像你已经是了。在

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

相关问题 更多 >