2015-10-16 83 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。