python-social-auth与Django,替换UserSocialAuth为自定义模型

4 投票
1 回答
1252 浏览
提问于 2025-04-18 18:42

我正在尝试将 python-social-auth 集成到一个已经存在的 Django 项目中。

我想使用一个已经存在的模型来管理用户的社交账户,而不是使用 UserSocialAuth(因为我的数据库里已经有了相关数据,还有一些自定义字段)。

有没有什么设置可以做到这一点呢?

我的自定义模型看起来是这样的:

class Channel(models.Model, DjangoUserMixin):
    PROVIDER_CHOICES = (
        ('twitter', 'Twitter'),
    )

    uid = models.CharField(max_length=255)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
                             related_name='channels')

    provider = models.CharField(max_length=32, choices=PROVIDER_CHOICES)
    extra_data = JSONField()

    class Meta:
        unique_together = ('provider', 'uid')

    @classmethod
    def get_social_auth(cls, provider, uid):
        try:
            return cls.objects.select_related('user').get(provider=provider, uid=uid)
        except Channel.DoesNotExist:
            return None

    username_max_length = 255
    user_model = get_user_model()

有什么想法吗?

1 个回答

4

通过创建一个自定义的 Storage 来解决这个问题:

# channels/models.py
# ...

class CustomSocialStorage(DjangoStorage):
    """To replace UserSocialAuth model with Channel"""
    user = Channel

然后在设置中注册它:

SOCIAL_AUTH_STORAGE = 'proj.channels.models.CustomSocialStorage'

出于某种原因,这个设置只在 Python-social-auth 文档的 “Django”部分 中有说明,而在设置页面上没有。

撰写回答