2015-10-16 56 views
1

我有一个类BaseUser和类RegisteredUser的正确方法(AbstractBaseUser是一个Django类)蟒蛇/ Django的:调用子类方法

class BaseUser(AbstractBaseUser): 
    #std properties of a base user 

class RegisteredUser(BaseUser): 
    def send_welcome_email(self): 
     #send the email 

用户可以被邀请到平台,然后她就得到了TempLogin :

class TempLogin(models.Model): 
    login_code: models.CharField(max_length=255, unique=True) 
    user: models.ForeignKey(BaseUser, unique=True) 

因此,用户有一个与它关联的login_code。它需要位于BaseUser上,因为支持其他用户类型。

然后,当用户到达与她的代码的平台,我期待的代码,并得到用户:

 code = TemporaryLoginCode.objects.get(code=pk) 
    user = code.user 
    user.send_welcome_email() 

最后一位符,因为send_welcome_email()RegisteredUser,不BaseUser

我不能移动send_welcome_email()RegisteredUser显然(第三方代码)。

我该如何让user成为RegisteredUser实例?我是否需要对数据库进行另一次查找,并将用户标识作为关键字,以便检索其RegisteredUser实例?还是有另一种方式?

我知道我不能使用super(),因为RegisteredUserBaseUser的子类,而不是其他方式。

+0

为什么不把'TempLogin.user'的外键'RegisteredUser'? – mipadi

+0

因为我不能(正如在描述中提到的那样),它是我必须支持的第三方代码。此外,邀请可以扩展到其他用户类型,这些用户类型不是RegisteredUser,但也是BaseUser的子类 – faboolous

回答

1

你不能。您已经定义了与BaseUser的关系。听起来像send_welcome_email应该在RegisteredUser上,因为你已经注册了,并且你会收到一封欢迎邮件。我建议当用户暂时注册时,他们不是注册用户。为什么不能有一类TemporaryUser,其中有一个方法send_temp_welcome_email,并让您的代码做

class TempUser(BaseUser): 
    def send_temp_welcome_email(self): 
    #send the tempemail 

class TempLogin(models.Model): 
    login_code: models.CharField(max_length=255, unique=True) 
    user: models.ForeignKey(TempUser, unique=True) 

code = TemporaryLoginCode.objects.get(code=pk) 
user = code.user 
user.send_temp_welcome_email() 
0

您是否尝试过在BaseUser中定义send_welcome_email()(如果您有所有需要的),并且在RegisteredUser中定义相同的方法,调用super().send_welcome_email()

我不明白哪个代码是第三部分,因为你有你的BaseUser,你提到RegisteredUser是第三部分,但是继承自你的BaseUser。