Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有Django多态性的Django自定义用户模型_Python_Django - Fatal编程技术网

Python 具有Django多态性的Django自定义用户模型

Python 具有Django多态性的Django自定义用户模型,python,django,Python,Django,当我试图通过user=request.user获取正确的模型名称时,我遇到了一些问题,它会显示每个用户喜欢的用户,即使是学生。 好的,这里有更多细节: from django.contrib.auth.models import AbstractBaseUser, BaseUserManager class UserManager(BaseUserManager): pass class User(AbstractBaseUser): objects = UserManage

当我试图通过
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多态性尝试了它,它对其他对象很有用,但是当我尝试从它继承所有东西时,我不知道如何做。 我试过这样的方法:

class User(AbstractBaseUser, PolymorphicModel):
    pass
在经理中:

class UserManager(BaseUserManager, PolymorphicManager):
    pass

但它不起作用,请有人告诉我如何一起配置它们,或者说从请求中获得正确型号名称的更好方法。用户

我找到了一些决策,下面是代码:

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\u class属性,
user.object\u class

这里还有一条路:

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

classname = get_class_name(user)

但我认为这无论如何都不是好办法……

你需要用一句话来区分它们。用户的独特性如何?即,他们是否有不同的用户组?如果是这样,您可以执行如下操作:
isStudent=request.user.groups.get(name='Student')
。然后在
if
语句中在您的视图中使用它。我在这里发现了一些没有django多态性的决策,但是我想知道更多关于使用django多态性的信息。[这里是]()我以前从未玩过多态性,直到今天晚些时候我才有设备来测试它。你还有问题吗???我发布了一个答案,但也许有人会给出更好的决定。