![](/img/trans.png)
[英]Insert data on OneToOneField using django-rest-framework
[英]Insert data using serializer class django-rest-framework
我是 Django 的初学者,尤其是 Django REST 框架的初学者。 在“UserRegistration”类中,我想使用“UserSerializer”创建一个新用户和 ExtendUser。 我怎样才能做到这一点?
class ExtendUser(models.Model):
user = models.OneToOneField(User, related_name='user_name', on_delete=models.CASCADE)
address = models.CharField(max_length=300)
phone = models.CharField(max_length=16)
picture = models.ImageField(upload_to='userImages/', default="default.webp", blank=True)
def __str__(self):
return str(self.user)
class UserSerializer(serializers.ModelSerializer):
password2 = serializers.CharField(write_only=True, style={'input_type':'password'})
class Meta:
model = User
fields = ['email', 'first_name', 'password', 'password2']
extra_kwargs = {'password' : {'write_only':True,}}
def save(self):
name = self.validated_data['first_name']
password = self.validated_data['password']
password2 = self.validated_data['password2']
if len(password) < 8:
raise serializers.ValidationError({'error':'Password must be 8-16 Characters '+
'and contain both numbers and letters/special character.'})
if password != password2:
raise serializers.ValidationError({'Password':'Password and Confirm Password Should be Same!'})
email = self.validated_data['email']
if User.objects.filter(email=email).exists() == True:
raise serializers.ValidationError({'E-mail': f"{email} this email already been used. Try another email."})
user = User.objects.create_user(username=email, email=email, password=password, first_name=name)
return user
class ExtendUserSerializer(serializers.ModelSerializer):
class Meta:
model = ExtendUser
fields = '__all__'
class UserRegistration(APIView):
def post(self, request):
user = UserSerializer(data=self.request.data)
if user.is_valid(raise_exception=True):
user.save()
refreshToken = RefreshToken.for_user(user)
context = {'access': str(refreshToken.access_token),
'refresh': str(refreshToken)}
return Response(context, status=status.HTTP_201_CREATED)
return Response(user.errors, status=status.HTTP_400_BAD_REQUEST)
在你的情况下:
class ExtendUser(User):
...
和:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = ExtendUser
Django 做了 o2o-foreign self。
但这并不正确,最好覆盖默认用户模型https://docs.djangoproject.com/en/dev/topics/auth/customizing/#using-a-custom-user-model-when-starting-一个专案
class ExtendUserSerializer(serializers.ModelSerializer):
password2 = serializers.CharField(write_only=True, style=
{'input_type':'password'})
password1 = serializers.CharField(write_only=True, style=
{'input_type':'password'})
email = serialzier.CharField()
first_name = serialzier.CharField()
class Meta:
model = ExtendUser
fields = ['email','password1','password2','first_name','address','phone','picture']
你的意见,py
首先我们创建用户并继续扩展用户
class UserRegistration(CreateAPIView):
def perform_create(self, serializer):
data = serialzier.validated_data
password_1 = data.pop('password1')
password_2 = data.pop('password2')
email = data.pop('email')
first_name = data.pop('first_name')
user = User.objects.create(email = email,first_name = first_name)
user.set_password(password_1)
user.save()
ExtendUser.objects.create(user=user,**data)
refreshToken = RefreshToken.for_user(user)
context = {'access': str(refreshToken.access_token),
'refresh': str(refreshToken)}
return Response(context, status=status.HTTP_201_CREATED)
return Response(user.errors, status=status.HTTP_400_BAD_REQUEST)
您可以使用验证功能进行进一步验证如果此解决方案有效,请尝试一次
如果您有任何错误,请告诉我
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.