当尝试验证两个字段的唯一性时,其中一个是模型中的外键字段,我使用了' validate_unique'。 根据{{3}}它应该返回400.我得到500。 这就是我使用它的方式:
在models.py中(模型是Item,foreign是Spec。经过测试的字段是'标识符'和' container_id):
def validate_unique(self, exclude=None):
u_item = Item.objects.filter(identifier=self.identifier)
if u_item.filter(spec__container=self.spec.container).exists():
uu_item = Item.objects.get(identifier=self.identifier)
print("already Exists")
print("item identifier: ", uu_item.identifier)
raise ValidationError('Identifier must be unique per Container')
def save(self, *args, **kwargs):
self.validate_unique()
super(Item, self).save(*args, **kwargs)
如上所述,当测试两个具有相同标识符和spec.container_id的项目时,我确实收到错误,但状态代码是500而不是400.
更新: 插入'保存' try-catch的功能:
def save(self, *args, **kwargs):
try:
self.validate_unique()
super(Item, self).save(*args, **kwargs)
except ValidationError as e:
print("Error:", e)
现在,它运行' save'无论如何 - 在' query.py'。
下的create()函数中答案 0 :(得分:0)
在django docs中,当唯一约束失败时,代码会引发验证错误。
if errors:
raise ValidationError(errors)
您的代码也是如此,您提出验证错误而不是捕获错误。捕获错误不会在代码中引发错误。如果您使用try catch并捕获异常,那么您可以发送状态400,message:id已经存在的相应响应。
try:
self.validate_unique()
except ValidationError as e:
print("Error: ",e)
# send the error with status 400