当无效时,Django validate_unique返回500

时间:2017-06-25 06:13:20

标签: python django unique

当尝试验证两个字段的唯一性时,其中一个是模型中的外键字段,我使用了' 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()函数中

1 个答案:

答案 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