在Django Rest框架中使用唯一字段更新模型

在Django Rest框架中使用唯一字段更新模型,django,django-models,django-rest-framework,django-views,Django,Django Models,Django Rest Framework,Django Views,当我尝试更新现有记录时,出现“值已存在”错误 我的数据库中有10家公司。现在我想编辑第四条记录。我希望更新公司的“短名称”并保持“全名”不变。当我点击提交时,邮递员全名字段“已存在”中将显示一条错误消息。我如何避免这种情况 Model.py class CompanyProfile(models.Model): id=models.UUIDField(默认值=uuid.uuid4, 可编辑=假, 主键=真, 详细的(name='ID',) short_name=models.CharField(

当我尝试更新现有记录时,出现“值已存在”错误

我的数据库中有10家公司。现在我想编辑第四条记录。我希望更新公司的“短名称”并保持“全名”不变。当我点击提交时,邮递员全名字段“已存在”中将显示一条错误消息。我如何避免这种情况

Model.py

class CompanyProfile(models.Model):
id=models.UUIDField(默认值=uuid.uuid4,
可编辑=假,
主键=真,
详细的(name='ID',)
short_name=models.CharField(最大长度=30,
空=真,
blank=True,)
全名=models.CharField(最大长度=255,
唯一=真,)
定义(自我):
return str(self.full_name)
序列化程序.py

class RegisterationCompanySerializer(serializers.ModelSerializer):
short_name=serializers.CharField(
最大长度=30,
validators=[UniqueValidator(queryset=CompanyProfile.objects.all(),
message=“短名称已存在或正在使用”)],
)
全名=serializers.CharField(
最大长度=255,
validators=[UniqueValidator(queryset=CompanyProfile.objects.all(),
message=“全名已存在或正在使用”),
)
类元:
模型=公司档案
字段='\uuuu所有\uuuu'
额外费用={
'short_name':{'required':True},
'全名':{'required':True},
}
views.py

class MainCompanyProfileView(ViewSet.ModelViewSet):
queryset=CompanyProfile.objects.all()
serializer_class=RegisterationCompanySerializer
权限\类=(permissions.AllowAny,)
def更新(self、request、pk=id、*args、**kwargs):
partial=kwargs.pop('partial',False)
实例=获取对象或404(公司profile,id=pk)
serializer=self.get\u序列化程序(实例,数据=request.data,部分=partial)
serializer.is\u有效(raise\u exception=True)
self.perform\u更新(序列化程序)
return super().update(请求,*args,**kwargs)
url.py

router=DefaultRouter()
路由器.寄存器(“”,Main Company ProfileView)
URL模式=[
路径('v1/',包括(router.url)),
]
堆栈跟踪 注意:每家公司都有很多领域,他们都举了一个例子来解决这个问题 现在,当我更新短名称时,保留完整名称不变

>company/views.py(56)update()
->partial=kwargs.pop('partial',False)
(Pdb)n
>company/views.py(57)update()
->实例=获取对象或404(公司profile,id=pk)
(Pdb)n
>/views.py(58)update()
->serializer=self.get\u序列化程序(实例,数据=request.data,部分=partial)
(Pdb)实例
(Pdb)n
>company/views.py(59)update()
->serializer.is\u有效(raise\u exception=True)
(Pdb)n
rest_framework.exceptions.ValidationError:{“全名”:[ErrorDetail(string='full name已存在或已在使用中',code='unique')]}
>company/views.py(59)update()
->serializer.is\u有效(raise\u exception=True)
验证错误

'full_name':[ErrorDetail(string='full name已经存在或正在使用',code='unique')]]

我们实际上发现了一个错误,即我将邮递员中的所有数据一起发送,这就是它暗示
全名已经存在的原因
,因此对于更新,我只需要发送需要更新的字段的数据

其他错误

  • 我应该从models.py中删除
    unique=True
    ,就像我在serializers.py中所做的那样
  • 在views.py中,不需要更新函数,因为它使用的是
    updateMixin
    ,该函数已经编写好并且运行良好

  • 您应该使用
    Patch
    方法而不是
    PUT
    方法来仅更新特定字段。

    是的,这就是我忘记提到的感谢@Harshit