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

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

问题描述

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

  class UserSerializer(serializers.ModelSerializer):

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

以下视图有什么区别,创建用户时建议使用哪一个?



查看A:

  def createUser(request):
if request.method =='POST':
serializer = UserSerializer(data = request.DATA)
如果serializer.is_valid():
serializer.save()
返回响应(serializer.data,status = status.HTTP_201_CREATED)
else:
return响应(serializer.errors,status = status.HTTP_400_BAD_REQUEST)

查看B:

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


返回响应(serializer.data,status = status.HTTP_201_CREATED)
else:
返回响应(serializer.errors,status = status.HTTP_400_BAD_REQUEST)


解决方案

这两个都不是完美的。但是查看A 看起来很有希望。




  • 查看是一个好的开始,但是它是不完整的解决方案。因为用户创建是只是 User.save ,而是你必须调用 User.create_user 方法。

  • 查看B是通过调用 User.create_user ,但是,这些视图包含逻辑,其实际上应该 Serializer.save()方法。



为了解决这个问题,你必须改变 Serializer.save() / code>方法。查看文档 Serializer.save(),将调用 Serializer.create() Serializer.update()



总而言之,我们必须覆盖 Serializer.create()用户创建并使用查看A

 #文件: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'],

返回用户


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?

View 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)

View 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)

解决方案

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

  • 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.

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().

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天全站免登陆