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:
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)
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 看起来很有希望。
- 视图 A 是一个好的开始,但它是不完整的 解决方案。因为
User
创建 而不是 只是 User.save
,而是你必须调用 User.create_user
方法。
- 视图 B 是通过调用
User.create_user
创建用户的正确方法,但是,视图包含一个 逻辑,实际上应该是 抽象 在 Serializer.save()
方法中。
要解决这个问题,您必须更改 Serializer.save()
方法的行为。查看 documentation、Serializer.save()
,将调用 Serializer.create()
或 Serializer.update()
。
总而言之,我们必须覆盖 Serializer.create()
来创建用户并使用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
假设我想注册一个用户(我正在使用位于 django.contrib.auth.models 中的用户模型)。假设这是我的 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)
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 看起来很有希望。
- 视图 A 是一个好的开始,但它是不完整的 解决方案。因为
User
创建 而不是 只是User.save
,而是你必须调用User.create_user
方法。 - 视图 B 是通过调用
User.create_user
创建用户的正确方法,但是,视图包含一个 逻辑,实际上应该是 抽象 在Serializer.save()
方法中。
要解决这个问题,您必须更改 Serializer.save()
方法的行为。查看 documentation、Serializer.save()
,将调用 Serializer.create()
或 Serializer.update()
。
总而言之,我们必须覆盖 Serializer.create()
来创建用户并使用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