【发布时间】:2015-12-04 01:23:31
【问题描述】:
我在我的 Django 项目中使用 django-rest-framework 和 python-social-auth。
这是我项目中UserSocialAuth模型的序列化类
class SocialAuthSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.CharField()
class Meta:
model = UserSocialAuth
fields = ('id', 'provider')
那我想在Serializer上面加一个字段UserSocialAuth.extra_data['login'],传统的方式应该是
class UserSocialAuth(AbstractUserSocialAuth):
def login:
return self.extra_data['login']
class SocialAuthSerializer(serializers.HyperlinkedModelSerializer):
login = serializers.CharField(source='login')
...
fields = ('id', 'provider', 'login')
问题是UserSocialAuth是属于python-social-auth的,我得直接把python-social-authapp的代码改成def login:,那么如何在现有模型UserSocialAuth中添加附加字段不用碰python-social-auth的代码。
【问题讨论】:
-
如果我对您的理解正确,您希望向现有类及其序列化程序添加功能。为什么不能编写自己的类
CustomUserSocialAuth(UserSocialAuth)并在那里实现登录方法?然后,您还可以编写一个CustomSocialAuthSerializer(SocialAuthSerializer),它从父级继承fields,并使用模型CustomUserSocialAuth,并相应地将login添加到其字段中。 -
但是
UserSocialAuth在python-social-auth中使用,我可以使用子类CustomUserSocialAuth的序列化器来序列化基类UserSocialAuth吗? -
我明白了。原则上,您可以在
python-social-auth内更改UserSocialAuth。这称为 Monkey-Patching,请参见此处:stackoverflow.com/questions/19545982/… 但我不建议这样做。如果您认为您使用的模块做错了,因为它将序列化程序与模型耦合得太紧,您应该考虑与模块的作者讨论,而不是猴子修补它。 -
我只是找到了一种方法来做到这一点,而无需触及原始课程,谢谢大家
标签: python django django-rest-framework python-social-auth