Django自定义用户模型与django-polymorphic

时间:2016-01-21 23:40:27

标签: python django

在尝试通过user = request.user获取正确的模型名称时遇到一些问题,它会向用户显示每个用户,即使它是学生。 好的,这里有更多细节:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class UserManager(BaseUserManager):
    pass

class User(AbstractBaseUser):
    objects = UserManager()
    pass

class Student(User):
    pass

当在视图代码中我尝试获取user = request.user时,我需要获取用户模型名称以向他们显示不同的视图。我尝试使用django-polymorphic,它适用于其他对象但是当我尝试从它继承时,一切都会失败,我不明白该怎么做。 我试过这样的事情:

class User(AbstractBaseUser, PolymorphicModel):
    pass

和经理:

class UserManager(BaseUserManager, PolymorphicManager):
    pass

但它不起作用,有人可以告诉我如何配置它们或说出更好的方法从request.user获取正确的模型名称

1 个答案:

答案 0 :(得分:0)

我发现了一些决定,这里是代码:

class InheritanceMetaclass(ModelBase):
    def __call__(cls, *args, **kwargs):
        obj = super(InheritanceMetaclass, cls).__call__(*args, **kwargs)
        return obj.get_object()

class User(AbstractBaseUser):
    __metaclass__ = InheritanceMetaclass

    object_class = models.CharField(max_length=20)
    objects = BaseUserManager()


   def get_object(self):
       if not self.object_class or self._meta.model_name == self.object_class:
           return self
       else:
           return getattr(self, self.object_class)

   def save(self, *args, **kwargs):
      if not self.object_class:
          self.object_class = self._meta.model_name
      super(User, self).save( *args, **kwargs)

# inherits
class User1(User):
    text1 = models.CharField(max_length=20)
    text2 = models.CharField(max_length=20)


class User2(User):
    text3 = models.CharField(max_length=20)
    text4 = models.CharField(max_length=20)

它接缝有效但我相信应该是更好的方法。 现在,您可以在object_class属性user.object_class

中获取用户类名

这里有另外一种方式:

def get_class_name(instance):
    return instance.__class__.__name__

然后:

classname = get_class_name(user)

但我不认为这是好方法......