我想查看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的正确示例。
答案 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有一些可选参数,用于检查null
和blank
等字段的内容,以检查该字段是否为空,因此有一些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)
答案 5 :(得分:-2)
你可以尝试
ean = models.BigIntegerField(requried=True)
...
newP = Product(name='Foo')
这个结果可能就是你想要的。