gpt4 book ai didi

DjangoRestFramework - 注册用户 : difference between UserSerializer. save() 和 User.objects.create_user()?

转载 作者:行者123 更新时间:2023-12-02 15:26:37 26 4
gpt4 key购买 nike

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

class UserSerializer(serializers.ModelSerializer):

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

以下 View 之间有什么区别,在创建用户时推荐使用哪个?

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)

最佳答案

这些都不是完美的。但观点 A 看起来很有前途。

  • View A 是一个好的开始,但它是不完整 的解决方案。因为User的创建不是简单的User.save,而是您必须调用User.create_user方法。
  • View B 是通过调用 User.create_user 创建用户的正确方法,但是, View 包含一个逻辑,实际上应该是抽象> 在 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

关于DjangoRestFramework - 注册用户 : difference between UserSerializer. save() 和 User.objects.create_user()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30085996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com