Python Django validate_unique在无效时返回500

Python Django validate_unique在无效时返回500,python,django,unique,Python,Django,Unique,当尝试验证两个字段中的唯一字段(其中哪一个字段是模型中的外键字段)时,我使用了“validate_unique”。 根据报告,它应该返回400。我得到500英镑。 我就是这样使用它的: 在models.py中(model为Item,foreign为Spec。测试字段为“identifier”和“container_id”): 如前所述,当测试具有相同标识符和spec.container_id的两个项目时,我确实会收到一个错误,但状态代码是500而不是400 更新: 插入“保存”函数以尝试捕获:

当尝试验证两个字段中的唯一字段(其中哪一个字段是模型中的外键字段)时,我使用了“validate_unique”。 根据报告,它应该返回400。我得到500英镑。 我就是这样使用它的:

在models.py中(model为Item,foreign为Spec。测试字段为“identifier”和“container_id”):

如前所述,当测试具有相同标识符和spec.container_id的两个项目时,我确实会收到一个错误,但状态代码是500而不是400

更新: 插入“保存”函数以尝试捕获:

 def save(self, *args, **kwargs):
    try:
        self.validate_unique()
        super(Item, self).save(*args, **kwargs)
    except ValidationError as e:
        print("Error:", e)
现在,它运行'query.py'下的create()函数中的'save'。

在django中,当unique约束失败时,代码会引发验证错误

if errors: 
    raise ValidationError(errors)
代码中也有同样的情况,您正在引发验证错误,而不是捕获错误。捕获错误不会在代码中抛出错误。如果使用try-catch并捕获异常,则可以发送状态为400、消息:id已存在的相应响应

try:
     self.validate_unique()
except ValidationError as e:
     print("Error: ",e)
     # send the error with status 400
在django中,当unique约束失败时,代码会引发验证错误

if errors: 
    raise ValidationError(errors)
代码中也有同样的情况,您正在引发验证错误,而不是捕获错误。捕获错误不会在代码中抛出错误。如果使用try-catch并捕获异常,则可以发送状态为400、消息:id已存在的相应响应

try:
     self.validate_unique()
except ValidationError as e:
     print("Error: ",e)
     # send the error with status 400

500是内部服务器错误。可能代码有问题。您是否尝试过使用一些打印语句进行调试。正如您在示例代码中所看到的,我使用了“print”,它打印所需的数据。只是为了确保,这是ValidationError的DRF版本,而不是来自django.core.exceptions的版本吗?实际上我不知道有两个版本。有什么区别?我看到我从django.core.exceptions导入(基本上使用DRF)500是内部服务器错误。可能代码有问题。您是否尝试过使用一些打印语句进行调试。正如您在示例代码中所看到的,我使用了“print”,它打印所需的数据。只是为了确保,这是ValidationError的DRF版本,而不是来自django.core.exceptions的版本吗?实际上我不知道有两个版本。有什么区别?我看到我是从django.core.exceptions导入的(基本上是使用DRF),谢谢你的评论。在这种情况下,“super(Item,self).save(*args,**kwargs)”应该在哪里?请将其放在try块中。所以如果validate_unique没有任何错误,那么只有super。。。。将被调用。我这样做了,它仍然保存模型。我现在看到在“query.py”下的“create”函数中还有另一个“save”。“保存”功能不应该也覆盖它吗?创建中的保存功能用于自动保存创建的模型对象。您可能已经在文档中注意到,当您为模型对象使用create方法时,不需要调用save函数。save函数不会覆盖那个东西。如果validate_unique失败,则不能调用
super(Item,self).save(*args,**kwargs)
如果验证失败,我不会运行“super.save()”。请参阅更新。感谢您的评论。在这种情况下,“super(Item,self).save(*args,**kwargs)”应该在哪里?请将其放在try块中。所以如果validate_unique没有任何错误,那么只有super。。。。将被调用。我这样做了,它仍然保存模型。我现在看到在“query.py”下的“create”函数中还有另一个“save”。“保存”功能不应该也覆盖它吗?创建中的保存功能用于自动保存创建的模型对象。您可能已经在文档中注意到,当您为模型对象使用create方法时,不需要调用save函数。save函数不会覆盖那个东西。如果validate_unique失败,则不能调用
super(Item,self).save(*args,**kwargs)
如果验证失败,我不会运行“super.save()”。请参阅更新。