在Django Rest框架中使用唯一字段更新模型
当我尝试更新现有记录时,出现“值已存在”错误 我的数据库中有10家公司。现在我想编辑第四条记录。我希望更新公司的“短名称”并保持“全名”不变。当我点击提交时,邮递员全名字段“已存在”中将显示一条错误消息。我如何避免这种情况 Model.py在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(
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')]]
我们实际上发现了一个错误,即我将邮递员中的所有数据一起发送,这就是它暗示全名已经存在的原因
,因此对于更新,我只需要发送需要更新的字段的数据
其他错误
unique=True
,就像我在serializers.py中所做的那样updateMixin
,该函数已经编写好并且运行良好您应该使用
Patch
方法而不是PUT
方法来仅更新特定字段。是的,这就是我忘记提到的感谢@Harshit