我已经看过所有类似的线程,阅读了文档,并尝试了多种组合以将空值存储为db的IntegerField,并且每次都失败。

我正在使用MySQL。

我的models.py定义了age=models.IntegerField()字段。我从csv文件填充db,并且某些单元格没有值。 Django文档说:

Field.null

If True, Django will store empty values as NULL in the database. Default is False.
Note that empty string values will always get stored as empty strings, not as NULL.

由于我正在使用IntegerField,因此我希望将一个空字符串(csv中的一个空单元格)作为NULL存储在db中。因此,我(认为)必须将null=True添加到age字段。实际上,我已经尝试了更多:
age=models.IntegerField()
age=models.IntegerField(null=True)
age=models.IntegerField(null=True, blank=True)
age=models.IntegerField(null=True, blank=True, default=None)

每次我向数据库插入一个空字符串时
ValueError: invalid literal for int() with base 10: ''

猜猜我还能做什么?

最佳答案

字符串不是整数;并且空白字符串不是NoneNULL。您需要做的是捕获字段为空的那些实例,然后将其强制转换为None

foo = "something" # "something" is coming from your CSV file

try:
   val = int(foo)
except ValueError:
   # foo is something that cannot be converted to
   # a number. It could be an empty string, or a
   # string like 'hello'
   # provide a default value
   val = None

# Now use val to insert into the database
f = MyModel()
f.age = val
f.save()

blank 严格用于前端验证;它对数据库方面没有任何影响:



另一方面, null 与数据库有关:


IntegerField要求可以将其转换为整数的值,因此当您传递空白字符串时,它无法强制转换并引发异常。相反,如果您传入None,并且您拥有age = models.IntegerField(null=True),它知道可以正确存储它。

总结一下:
  • age = models.IntegerField()
    必填字段,并且需要一个有效的整数值。它不接受None,并且数据库中没有空值。有效值为-2147483648至2147483647
  • age = models.IntegerField(null=True)
    必填字段(表单验证)。如果该字段的值为None,它将在数据库中转换为NULL
  • age = models.IntegerField(blank=True, null=True)
    字段不是必需的(表单验证)。如果该字段以None传递,它将被转换为NULL
  • age = models.IntegerField(blank=True)
    字段不是必需的(表单验证),但是由于数据库不接受空值,因此需要传递有效的整数值。通常,在这里您可以使用default=0为它提供默认值,或者在将值提交到orm之前进行一些验证。
  • 10-05 21:09