【问题标题】:How to add and serialise additional fields of an existing model in Django如何在 Django 中添加和序列化现有模型的附加字段
【发布时间】:2015-12-04 01:23:31
【问题描述】:

我在我的 Django 项目中使用 django-rest-frameworkpython-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


【解决方案1】:

我只是发现我可以在这里使用SerializerMethodField,不需要更改原始类UserSocialAuth,只需在序列化器中再添加一个字段,如下所示:

class SocialAuthSerializer(serializers.HyperlinkedModelSerializer):
    login = serializers.SerializerMethodField()

    def get_login(self, obj):
        return obj.extra_data['login']

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2018-05-08
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多