python / django:调用子类方法的正确方法

时间:2015-10-16 20:39:48

标签: python django

我有一个班级BaseUser和一个班级RegisteredUserAbstractBaseUser是一个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个实例?我是否需要在数据库上执行另一次查找,并将用户ID作为密钥,以便检索其RegisteredUser实例?或者还有另一种方式吗?

我知道我不能使用super(),因为RegisteredUserBaseUser的子类,而不是相反。

2 个答案:

答案 0 :(得分: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() 

答案 1 :(得分:0)

您是否尝试在BaseUser中定义send_welcome_email()(如果您有所需的全部内容)并在RegisteredUser中调用super().send_welcome_email()使用相同的方法?

我不知道哪个代码是第三部分,因为你有你的BaseUser并且你提到RegisteredUser是第三部分但是从你的BaseUser继承。