2013-10-19 58 views
2

我有一個Django項目,它使用通過pip安裝的第三方包。我想從該軟件包中擴展一個模型,並希望知道這種情況下的最佳實踐。我可以通過猴子補丁獲得我想要的功能,但是我明白這不一定是好的做法。我只是添加一個方法,所以沒有影響數據庫。Django將方法添加到第三方模型

這是我目前的解決方案。

models.py

from allauth.socialaccount.models import SocialAccount 

def get_foo(self): 
    ... 
    return foo 

SocialAccount.get_foo = get_foo 

views.py

social_acc = SocialAccount.objects.get(
    ... 
) 

foo = social_acc.get_foo() 

我覺得我應該繼承和子類,但然後當然我失去參考其中包含了所有我需要的基本數據的原始模型。

任何幫助非常讚賞。

回答

4

你絕對應該使用子類。如果按「,但當然我鬆散地參考了原始模型,其中包含我需要的所有基本數據」「您的意思是將爲您的新子類創建一個新的數據庫表,這裏有一個非常簡單的解決方案。使用proxy inheritance

from allauth.socialaccount.models import SocialAccount 

class YourSocialAuth(SocialAccount): 
    def get_foo(self): 
     ... 
     return foo 

    class Meta: 
     proxy = True 

YourSocialAuth使用同一個數據庫表(包括數據包含)作爲SocialAccount,所以每一個對象通過SocialAccount訪問,也可通過YourSocialAuth,但是當你使用前者,有可自定義的方法:

social_acc = YourSocialAccount.objects.get(
    ... 
) 

foo = social_acc.get_foo()