我是Django和DRF的新手,但我试图使用DRF的序列化程序覆盖djosers默认的用户注册行为。
(djoser =用于用户注册/登录/密码重置等的DRF库)
我有djosers视图,它使用序列化程序创建用户对象
def perform_create(self, serializer): user = serializer.save()
我的想法是重写这个序列化程序以实现以下目标:
最后一点给我带来了麻烦,因为我不知道如何在序列化程序中实现这种自定义行为。我使输入字段是只读的,所以它们不包括在我的响应中。在save
方法中,创建一个用户+帐户对象,登录到用户中,然后返回用户(视图需要该用户)
如何使用创建的令牌字符串将创建的帐户对象序列化为一个响应?
这是我的序列化程序(简化并从某些东西中剥离出来,但基本上就是这样)
class UserRegistrationSerializer(serializers.Serializer):
email = serializers.EmailField(write_only=True)
# some other fields
password = serializers.CharField(style={'input_type': 'password'},
write_only=True,
validators=settings.get('PASSWORD_VALIDATORS')
)
# this should be the output
account = Account(read_only=True)
def save(self):
user = User(email=self.validated_data['email'])
user.set_password(self.validated_data['password'])
user.save()
account = Account(user=user)
token = #logging in my user
return user
发布于 2017-05-04 23:39:34
用这个:
class UserRegistrationSerializer(serializers.ModelSerializer):
email = serializers.EmailField(write_only=True)
# some other fields
password = serializers.CharField(
style={'input_type': 'password'},
write_only=True,
validators=settings.get('PASSWORD_VALIDATORS')
)
# make sure you have related_name='account' in your one to one field
account = AccountSerializer(read_only=True)
# the token field
auth_token = TokenSerializer(read_only=True)
class Meta:
model = User
# define fields based on your needs
fields = ...
def create(self, validated_data):
user = User(email=self.validated_data['email'])
user.set_password(self.validated_data['password'])
user.save()
# create account
account = Account(user=user)
# create token for user
token = Token.objects.update_or_create(user=user)
return user
您还需要根据自定义需求创建一个update
方法。
https://stackoverflow.com/questions/43798919
复制