DjangoRestFramework - 注册用户:UserSerializer.save() 和 User.objects.create_user() 之间的区别? [英] DjangoRestFramework - registering a user: difference between UserSerializer.save() and User.objects.create_user()?

查看:14
本文介绍了DjangoRestFramework - 注册用户:UserSerializer.save() 和 User.objects.create_user() 之间的区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我想注册一个用户(我正在使用位于 django.contrib.auth.models 中的用户模型).假设这是我的 serializers.py:

Suppose I want to register a user (I'm using the User model located in django.contrib.auth.models). Assume this is my serializers.py:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )

以下视图有什么区别,在创建用户时推荐使用哪种视图?

What's the difference between the following views, and which one is recommended when it comes to creating a user?

视图 A:

def createUser(request):
    if request.method == 'POST':
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

视图 B:

def createUser(request):
    serializer = UserSerializer(data=request.DATA)
    if serializer.is_valid():
        user = User.objects.create_user(
            email = serializer.init_data['email'],
            username = serializer.init_data['username'],
            password = serializer.init_data['password'],
        )

        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

推荐答案

这些都不是完美的.但观点 A 看起来很有希望.

Neither of those is perfect. But View A looks promising.

  • 视图 A 是一个好的开始,但它是不完整的解决方案.因为User创建不是简单的User.save,而是你必须调用User.create_user方法.
  • 视图 B 是通过调用 User.create_user 创建用户的正确方法,但是,视图包含一个逻辑,实际上应该抽象> 在 Serializer.save() 方法中.
  • View A is a good start, but it is incomplete solution. Because User creation is not simply User.save, but rather you have to call User.create_user method.
  • View B is the correct way to create user by calling User.create_user, however, the views contains a logic which should actually be abstracted within the Serializer.save() method.

要解决这个问题,您必须更改Serializer.save() 方法的行为.查看文档Serializer.save(),将调用 Serializer.create()Serializer.update().

To solve this, you have to change the behavior of Serializer.save() method. Looking at the documentation, Serializer.save(), will call either Serializer.create() or Serializer.update().

总而言之,我们必须覆盖用于创建用户的Serializer.create()并使用视图A.

In summary, we have to override the Serializer.create() for user creation and use View A.

# File: serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def create(self, validated_data):
        user = User.objects.create_user(
            email = validated_data['email'],
            username = validated_data['username'],
            password = validated_data['password'],
        )
        return user

这篇关于DjangoRestFramework - 注册用户:UserSerializer.save() 和 User.objects.create_user() 之间的区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆