Django REST Framework 序列化器输出

Django REST Framework Serializer output

我是 Django 和 DRF 的新手,但我正在尝试使用 DRF 的序列化程序来覆盖 djosers 默认用户注册行为。
(djoser = 用户 registration/login/password 重置等的 DRF 库)

我有 djosers 视图,它使用序列化程序创建用户对象
def perform_create(self, serializer): user = serializer.save()

我的想法是覆盖此序列化程序以实现以下目的:

  1. 创建用户
  2. 并行创建帐户对象
  3. 登录用户
  4. return 帐户对象和一个响应中的身份验证令牌

最后一点给我带来了麻烦,因为我不知道如何在序列化程序中实现这种自定义行为。我将输入字段设置为只读,因此它们不包含在我的回复中。在 save 方法中创建一个用户 + 帐户对象,登录用户然后我 return 用户(视图需要)
如何将创建的帐户对象与创建的令牌字符串序列化为一个响应?

这是我的序列化程序(经过简化和去除了一些东西,但基本上就是这样)

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

使用这个:

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 方法。