django中的多个用户

时间:2016-04-20 15:09:42

标签: python django authentication django-rest-framework

我的应用中有两个用户,所以我通过像这样继承AbstractBaseUser来构建自定义用户,

class MyUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    name = models.CharField(max_length=200, null=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()
    #other methods required here

和我的用户:

class User1(MyUser):
    mobile_no = models.CharField(max_length=10, blank=True, null=True, validators=[validators.MinLengthValidator(10),
                                 validators.MaxLengthValidator(10)])
    profile_pic = models.ImageField(upload_to=Rename('user1_profiles'), null=True, blank=True)
    about = models.TextField(null=True, blank=True)
    other_details = models.TextField(null=True, blank=True)

class User2(MyUser):
    mobile_no = models.CharField(max_length=10,blank=True, null=True, validators=[validators.MinLengthValidator(10),
                                 validators.MaxLengthValidator(10)], unique=True)
    avatar = models.ImageField(upload_to=Rename('profiles'), null=True, blank=True,)

这很好用,但当我尝试让用户使用request.user时,我得到了MyUser个实例。在某些API中,我希望在其他API中为User1User2。为了实现这一点,我在每个API中使用它:

user = User1.objects.get(id=request.user.id)

user = User2.objects.get(id=request.user.id)

有更优雅的方式吗?如何阻止User1类型用户访问为User2类型的用户构建的API。

1 个答案:

答案 0 :(得分:1)

request.user将始终返回MyUser实例。

在MyUser中添加以下属性 -

 TYPES_OF_USERS = (("A", "USER1"), ("B", "USER2"))
 user_type = models.Charfield(max_length=1, choices=TYPES_OF_USERS)

然后,使用此代码

if request.user.user_type == "A":
      foo = request.user.User1.profile_pic
else:
      foo = request.user.User1.avatar

作为补充说明 - 由于移动设备对两种型号都是通用的,因此将其存储在MyUser主模型中。