我已经看过所有类似的线程,阅读了文档,并尝试了许多组合来将空值存储IntegerField在db中,并且每次都失败。
IntegerField
我正在使用MySQL。
我models.py定义了一个age=models.IntegerField()字段。我从csv文件填充db,并且某些单元格没有值。Django文档说:
models.py
age=models.IntegerField()
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字段中。实际上,我已经尝试了更多:
NULL
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: ''
猜猜我还能做什么?
字符串不是整数;而空白字符串不是None或NULL。您需要做的是捕获字段为空的那些实例,然后将其强制转换为None。
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严格用于前端验证;它对数据库方面没有任何影响:
blank
请注意,这与有所不同null。null与数据库完全相关,而blank与验证相关。如果字段包含blank=True,则表单验证将允许输入一个空值。如果字段包含blank=False,则将需要该字段。
null
blank=True
blank=False
null 另一方面,与数据库有关:
如果为True,则Django将在数据库中将空值存储为NULL。默认值为False。
一个IntegerFieldrequire值可以转换为整数,因此当您传入一个 空白字符串时 ,它不能强制转换并引发异常。相反,如果您传入None,并且拥有age = models.IntegerField(null=True),它将知道正确存储它。
age = models.IntegerField(null=True)
总结一下:
age = models.IntegerField()
必填字段,并且需要一个有效的整数值。它不会接受,None并且在数据库中将没有空值。有效值为-2147483648至2147483647
必填字段(表单验证)。如果该字段具有None值,则将其转换为NULL数据库中的值。
age = models.IntegerField(blank=True, null=True)
字段不是必需的(表单验证)。如果传入该字段None,它将被翻译成NULL
age = models.IntegerField(blank=True)
字段不是必需的(表单验证),但是由于数据库不接受空值,因此需要传递有效的整数值。通常,在将值default=0提交给orm之前,您可以在其中使用默认值或进行一些验证。
default=0