首页 > 解决方案 > 有什么方法可以摆脱这个错误。(1062,“密钥'customer_customerprofile.user_id'的重复条目'2'”)?

问题描述

我必须像在这个程序中一样,从 lat 和 on 创建一个名为 location 的字段。位置打印正确,但保存时出现重复输入错误。当 post 功能起作用时,我需要将 user_id 更新为 id 。由于它被保存了两次,因此显示了重复输入错误。

def post(self, request, format=None):
            serializer = CustomerSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                lat = serializer.data.get('latitude',None)
                lon=serializer.data.get('longitude',None)
                lat_1=float(lat)
                lon_1=float(lon)
                location=Point((lat_1,lon_1),srid=4326)
                print(location)
                id=serializer.data.get('user')
                print(id)
                v=CustomerProfile(location=location,user_id=id)
                v.save()
                return Response({"message":"Customer Profile Updated Successfully","data":serializer.data}, status=200)
            return Response({"message":"Customer registration failed!!","data":serializer.data}, status=400)

用户模型

class CustomUser(AbstractUser):
    username = models.CharField(max_length=10,unique=True,blank=True,null=True)
    email = models.EmailField(_('email address'), unique=True)
    phone = models.CharField(max_length=13)

    is_admin = models.BooleanField(default=False)
    is_service_provider = models.BooleanField(default=False)
    is_customer = models.BooleanField(default=False)


    # is_active=models.BooleanField(default=False)
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['phone','email']

客户档案模型

class CustomerProfile(models.Model):
    user = models.OneToOneField(CustomUser,on_delete=models.CASCADE)
    location = models.PointField(default=Point(0,0),geography=True)
    latitude = models.DecimalField(blank=True,max_digits=9,decimal_places=6,default=None,null=True)
    longitude = models.DecimalField(blank=True,max_digits=9,decimal_places=6,default=None,null=True)

标签: djangorestdjango-rest-framework

解决方案


您创建了新实例,而不是我们获取(v=CustomerProfile.objects.get(id=id))这个用户并更新。

def post(self, request, format=None):
            serializer = CustomerSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                lat = serializer.data.get('latitude',None)
                lon=serializer.data.get('longitude',None)
                lat_1=float(lat)
                lon_1=float(lon)
                location=Point((lat_1,lon_1),srid=4326)
                print(location)
                id=serializer.data.get('user')
                print(id)
                v=CustomerProfile.objects.get(id=id)
                v.location = location
                v.save()
                return Response({"message":"Customer Profile Updated Successfully","data":serializer.data}, status=200)
            return Response({"message":"Customer registration failed!!","data":serializer.data}, status=400)

推荐阅读