【问题标题】:Django REST Framework Serializer outputDjango REST 框架序列化程序输出
【发布时间】:2017-10-03 13:54:55
【问题描述】:

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

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

我的想法是重写此序列化程序以实现以下目标:

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

最后一点给我带来了麻烦,因为我不知道如何在序列化程序中实现这种自定义行为。我将输入字段设为只读,因此它们不包含在我的回复中。在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

【问题讨论】:

    标签: django python-2.7 django-rest-framework django-serializer


    【解决方案1】:

    使用这个:

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

    【讨论】:

    • 甜,成功了!然而,这只适用于用户模型同时引用了 Account 模型和 Token 模型。只是为了将来,如何将与用户完全无关的东西序列化到响应中?
    • @JimmyVanBraun 为此,您可以使用方法字段。查看django-rest-framework.org/api-guide/fields/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2020-09-07
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2016-07-19
    相关资源
    最近更新 更多