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

Dar*_*ech 2 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
Run Code Online (Sandbox Code Playgroud)

views.py

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

foo = social_acc.get_foo()
Run Code Online (Sandbox Code Playgroud)

我觉得我应该继承和继承,但当然我松散地引用了包含我需要的所有基本数据的原始模型.

任何帮助非常感谢.

Lud*_*mer 5

你绝对应该使用子类.如果"但当然我松散地引用了包含我需要的所有基本数据的原始模型",你的意思是将为你的新子类创建一个新的数据库表,有一个非常简单的解决方案.使用代理继承:

from allauth.socialaccount.models import SocialAccount

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

    class Meta:
        proxy = True
Run Code Online (Sandbox Code Playgroud)

YourSocialAuth使用相同的数据库表(包括它包含的数据)作为SocialAccount,因此通过SocialAccount可访问的每个对象也可通过YourSocialAuth获得,但是当您使用前者时,您可以使用自定义方法:

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

foo = social_acc.get_foo()
Run Code Online (Sandbox Code Playgroud)