DjangoRestFramework - 注册用户:UserSerializer.save()和User.objects.create_user()之间的区别? [英] DjangoRestFramework - registering a user: difference between UserSerializer.save() and User.objects.create_user()?
问题描述
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 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.
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屋!