DRF:在序列化程序中默认UserProfile字段的方法?

时间:2018-03-03 13:37:11

标签: python django django-rest-framework

在序列化程序中使用当前的用户模型很简单:

user = serializers.PrimaryKeyRelatedField(
        read_only=True,
        default=serializers.CurrentUserDefault()
    )

但是如果我有自己的UserProfile模型并且我想在序列化程序中使用当前的UserProfile会怎样。只做CurrentUserDefault().profile当然不起作用,因为此时这是一个空对象。

1 个答案:

答案 0 :(得分:0)

事实证明这个问题很容易解决。如果你看一下CurrentUserDefault类的源代码,你会发现它非常简单:

class CurrentUserDefault(object):
    def set_context(self, serializer_field):
        self.user = serializer_field.context['request'].user

    def __call__(self):
        return self.user

    def __repr__(self):
        return unicode_to_repr('%s()' % self.__class__.__name__)

我猜set_context调用Serializer,然后调用__call__方法来接收对象。 因此,以任何您想要的方式重写此代码非常简单。

<强> TLDR

只需在此处添加:

class CurrentUserProfileDefault(serializers.CurrentUserDefault):
    def __call__(self):
        return self.user.userprofile

无论你需要你的个人资料,只需写下:

user_profile = serializers.PrimaryKeyRelatedField(
        read_only=True,
        default=serializers.CurrentUserProfileDefault()
    )