Django IntegrityError,获取错误号或代码

时间:2015-04-29 10:32:14

标签: python django

我想查看IntegrityError(1048, "Column 'ean' cannot be null")
这样做的正确方法是什么?我觉得我没有使用最好的方法。

产品类

class Product(models.Model):
    ean = models.BigIntegerField()
    name = models.CharField()

目前我正在做这个疯狂的伎俩。

newProduct = Product(ean=None, name='Foo')

try:
    newProduct.save()
except IntegrityError, e:
    error = e

code = error.__getslice__(0,1)
code = error[0]

# handle error 1048

我很想看到在Python / Django中处理特定IntegrityError的正确示例。

6 个答案:

答案 0 :(得分:1)

我认为最好的解决方案不是处理IntegrityError,而是在保存之前验证模型实例:

# Run validation
try:
    newProduct.full_clean()
except ValidationError as error:
    error.error_dict  # A dictionary mapping field names to lists of ValidationErrors.
    error.message_dict  # A dictionary mapping field names to lists of error messages.

    # In your case you can check
    for e in error.error_dict.get('ean'):
        if e.code == 'blank':
            # ean was empty

答案 1 :(得分:1)

IntegrityError异常处理几乎没有什么不同,因此要获取数字。

e.args[0]

有关更多信息:https://www.programcreek.com/python/example/5321/MySQLdb.IntegrityError

答案 2 :(得分:0)

Django有一些可选参数,用于检查nullblank等字段的内容,以检查该字段是否为空,因此有一些validators可用于检查内容例如,字段使用django MinLengthValidator来检查ean字段内容的长度:

from django.core.validators import MinLengthValidator

class Product(models.Model):
    ean = models.BigIntegerField(null=False, validators=MinLengthValidator(1, message='The "ean" field min length is one char at least.'))
    name = models.CharField()

使用MinLengthValidator,如果ean字段为空,则可以返回自定义消息。

答案 3 :(得分:0)

Field ean是必填字段,您无法将None值传递给它。要解决此问题,请添加

ean = models.BigIntegerField(null=True,blank=True)

然后它不会显示完整性错误。现在,该字段期望某些数据不是空值。

否则

 newProduct = Product(ean=256, name='Foo')

传递一个整数值。这对我有用。

您还可以对某些表单进行验证,以防止出现此问题。

示例:

def clean_ean(self):
    data = self.cleaned_data['ean']
    if "fred@example.com" not in data:
        raise forms.ValidationError("message")

    # Always return the cleaned data, whether you have changed it or
    # not.
    return data

参见:https://docs.djangoproject.com/en/1.8/ref/forms/validation/

答案 4 :(得分:0)

我在保存之前制作了一个验证产品对象的方法。这样,我确信我可以保存产品而不会遇到错误。感谢您的提示!

有关更多信息,请参阅有关验证对象的Django documentation

5

答案 5 :(得分:-2)

你可以尝试

ean = models.BigIntegerField(requried=True)
...
newP = Product(name='Foo')

这个结果可能就是你想要的。