我有一个Django项目,该项目使用通过pip
安装的第三方软件包。我想从该包中扩展一个模型,并想知道在这种情况下最佳实践是什么。我可以通过猴子修补获得我想要的功能,但我知道这不一定是好习惯。我只是添加一个方法,所以不会影响数据库。
这是我目前的解决方案。
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()
我觉得我应该继承和分类,但当然我失去了对包含我需要的所有基本数据的原始模型的引用。
答案 0 :(得分:5)
你绝对应该使用子类。如果通过“但当然我失去了对包含我需要的所有基本数据的原始模型的引用”你意味着将为你的新子类创建一个新的数据库表,真的有一个简单的解决方案。使用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()