2

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

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

4

1 回答 1

6

你绝对应该使用子类化。如果通过“但是当然我失去了对包含我需要的所有基本数据的原始模型的引用”,您的意思是将为您的新子类创建一个新的数据库表,那么有一个非常简单的解决方案。使用代理继承

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()
于 2013-10-19T20:11:06.107 回答