2016-04-20 19 views
0

Ich habe zwei Benutzer in meiner app, so habe ich eine benutzerdefinierte gebaut von AbstractBaseUser wie diese Subklassen,Mehrere Benutzer in django

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 

und meine Benutzer:

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,) 

Dies funktioniert gut, aber Wenn ich versuche, Benutzer mit request.user zu bekommen bekomme ich MyUser Instanz. In einigen APIs möchte ich das in anderen APIs User1 und User2 sein. Um diese Arbeit ich das in jedem API bin mit:

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

oder

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

Gibt es eine elegantere Möglichkeit, dies zu tun? Wie kann ich verhindern, dass Nutzer vom Typ "User1" auf APIs zugreifen, die für Benutzer "User2" erstellt wurden?

Antwort

1

request.user gibt immer die MyUser-Instanz zurück.

das folgende Attribut in MyUser hinzufügen -

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

Verwenden Sie dann diesen Code

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

Als zusätzliche Note- Da Mobil für beide Modelle gemeinsam ist, sollte sie in der Haupt MyUser Modell .

+0

Gibt es eine bessere Lösung als einen Decorator in jeder Ansicht zu verwenden, um Zugriff auf den richtigen Benutzertyp zu erhalten? – dnit13

+0

Sie können die Erlaubnis Mixin verwenden, obwohl es keinen großen Unterschied machen wird. – RA123