DjangoRestFramework - 注册用户:UserSerializer.save() 和 User.objects.create_user() 之间的区别? [英] DjangoRestFramework - registering a user: difference between UserSerializer.save() and 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 simplyUser.save
, but rather you have to callUser.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 theSerializer.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屋!