小编典典

如何将空值存储为Integerfield

python

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

我正在使用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: ''

猜猜我还能做什么?


阅读 257

收藏
2021-01-20

共1个答案

小编典典

字符串不是整数;而空白字符串不是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严格用于前端验证;它对数据库方面没有任何影响:

请注意,这与有所不同nullnull与数据库完全相关,而blank与验证相关。如果字段包含blank=True,则表单验证将允许输入一个空值。如果字段包含blank=False,则将需要该字段。

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

如果为True,则Django将在数据库中将空值存储为NULL。默认值为False。

一个IntegerFieldrequire值可以转换为整数,因此当您传入一个 空白字符串时
,它不能强制转换并引发异常。相反,如果您传入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之前,您可以在其中使用默认值或进行一些验证。

2021-01-20