在序列化器中使用当前用户模型很简单:
user = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserDefault()
)
但是,如果我有自己的UserProfile模型,并且我想在序列化程序中使用当前的UserProfile,该怎么办?只是做CurrentUserDefault().profile
当然不起作用,因为此时这是一个空对象。
事实证明这个问题很容易解决。如果你看一下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()
)