简体   繁体   English

使用序列化程序类 django-rest-framework 插入数据

[英]Insert data using serializer class django-rest-framework

I am a beginner with Django and especially with the Django REST framework.我是 Django 的初学者,尤其是 Django REST 框架的初学者。 Inside "UserRegistration" class, I want to create a new user and ExtendUser using "UserSerializer".在“UserRegistration”类中,我想使用“UserSerializer”创建一个新用户和 ExtendUser。 how can I do that?我怎样才能做到这一点?

this is my models.py这是我的models.py

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)

this is my serializers.py这是我的serializers.py

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__'

this is my views.py这是我的意见.py

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)

in your case:在你的情况下:

class ExtendUser(User):
    ...

and:和:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = ExtendUser

Django made o2o-foreign self. Django 做了 o2o-foreign self。

But it is not really correct, it is better to override default User Model https://docs.djangoproject.com/en/dev/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project但这并不正确,最好覆盖默认用户模型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']

Your Views,py你的意见,py

Firstly we create user and proceed to extend user首先我们创建用户并继续扩展用户

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)

You can do further validation with Validate Function Please have try once if this solution works您可以使用验证功能进行进一步验证如果此解决方案有效,请尝试一次

please let me know if you got any error如果您有任何错误,请告诉我

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用 django-rest-framework 在 OneToOneField 上插入数据 - Insert data on OneToOneField using django-rest-framework Django-Rest-Framework 串行器验证数据返回 无 - Django-Rest-Framework Serializer validate data return None django-rest-framework 中的可写嵌套序列化程序? - Writable nested serializer in django-rest-framework? Django-Rest-Framework中序列化器的问题 - Issues with Serializer in Django-Rest-Framework 将可编辑字段作为 Django-Rest-Framework 串行器的验证数据方法传递 - Passing Editable Fields as validated_data method of Django-Rest-Framework Serializer django-rest-framework:无法调用`.is_valid()`,因为在实例化序列化器实例时没有传递`data =`关键字参数 - django-rest-framework: Cannot call `.is_valid()` as no `data=` keyword argument was passed when instantiating the serializer instance 如何在 django-rest-framework 的序列化器中使用时区序列化时间? - how to serialize time with timezone in django-rest-framework's serializer? 覆盖 Django-Rest-Framework 序列化程序 is_valid 方法 - Overriding Django-Rest-Framework serializer is_valid method django-rest-framework 如何使模型序列化器字段成为必需 - django-rest-framework how to make model serializer fields required 根据django-rest-framework序列化器中的请求显示字段 - Display fields based on the request in django-rest-framework serializer
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM