Django为第三方模型添加了一种方法

时间:2013-10-19 20:03:07

标签: python django django-models

我有一个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()

我觉得我应该继承和分类,但当然我失去了对包含我需要的所有基本数据的原始模型的引用。

1 个答案:

答案 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()
相关问题