如何使用Django序列化程序更新自定义用户模型的字段

问题描述 投票:0回答:1

当用户想要更新之前创建的模型时,我正在尝试更新该模型的各个字段。我正在使用自定义用户模型,并且正在使用django rest框架进行更新api。

views.py

class UserUpdate(generics.UpdateAPIView):
    """
    Update user.
    """
    parser_class = (FileUploadParser,)
    permission_classes = (AllowAny,)
    queryset = User.objects.all()
    serializer_class = UserUpdateSerializer

    def update(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.user_id = request.data.get("user_id")
        instance.save()
        serializer = self.get_serializer(instance, data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        return Response(serializer.data)

models.py

class User(models.Model):
    USER_CHOICES = (
        (1, u'ADMIN'),
        (2, u'SALES'),
        (3, u'KITCHEN'),
        (4, u'EMPLOYEE'),
    )
    image = models.ImageField(upload_to='employees/', null = True, blank = True)
    name = models.CharField(max_length=50)
    user_id = models.CharField(max_length=30, primary_key = True, blank = False)
    email = models.CharField(max_length=50)
    password = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    user_group = models.PositiveSmallIntegerField(default=4, choices=USER_CHOICES)
    firebase_token = models.CharField(max_length=150, default=None, null = True)
    shop =  models.ForeignKey(Shop, on_delete=models.SET_DEFAULT, default=None)
    phone = PhoneField(blank=False, default=0)

serializers.py

class UserUpdateSerializer(serializers.ModelSerializer):
    shop = serializers.CharField()
    class Meta:
        model = User
        fields = ('image', 'url', 'phone', 'name', 'user_id','email', 'password', 'is_active', 'user_group', 'shop')

    def update(self, instance, validated_data):
        shop = validated_data.pop('shop')
        user_id = validated_data.pop("user_id")
        print(user_id)
        shopId = Shop.objects.filter(name=shop).values('shop_id').first()
        if shopId is not None:
            shop_id = shopId['shop_id']
            try:
                if user_id is not None:
                    instance.name = validated_data.get('name', instance.name)
                    instance.image = validated_data.get('image', instance.image)
                    instance.email = validated_data.get('email', instance.email)
                    instance.phone = validated_data.get('phone', instance.phone)
                    instance.password = validated_data.get('password', instance.password)
                    instance.user_group = validated_data.get('user_group', instance.user_group)
                    instance.shop_id = validated_data.get('shop_id', instance.shop_id)
                    instance.user_id = validated_data.get('user_id', instance.user_id)
                    instance.is_active =  True
                    instance.save()
                    return instance
                else:
                    print("Test")
            except Exception as e:
                return e
        else:
            return None

这引发错误,表明用户已经存在!

请协助!

django django-rest-framework django-serializer drf-queryset
1个回答
0
投票

[当您调用UserUpdate API时,它将为每个新User创建一个新的user_id。我不知道您为什么要更新user_id。任何新的user_id将创建一个新的User实例。如果要更新user_id以外的其他内容,则需要删除以下行。

  1. UserUpdate API视图中删除这些行。

    instance.user_id = request.data.get("user_id")       
    instance.save()
    
  2. UserUpdateSerializer删除此行

    instance.user_id = validated_data.get('user_id', instance.user_id)
    
  3. lookup_field = 'user_id'添加到UserUpdate API视图

© www.soinside.com 2019 - 2024. All rights reserved.