我有一个类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实例?为了检索其RegisteredUser实例,是否需要以用户ID为键在数据库上进行另一次查找?还是有另一种方法?

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

最佳答案

你不能您已经定义了与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()

关于python - python/django:调用子类方法的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33179199/

10-10 01:29