我已经看过所有类似的线程,阅读文档,并尝试了许多组合在db中将空值存储为IntegerField
并且每次都失败。
我正在使用MySQL。
我的models.py
定义了age=models.IntegerField()
字段。我从csv文件填充db,有些单元格没有值。 Django docs说:
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的空单元格)存储为db中的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: ''
有什么猜测我还能做什么?
答案 0 :(得分:40)
字符串不是整数;并且空白字符串不是None
或NULL
。您需要做的是捕获字段为空的实例,然后将其强制转换为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
不同。null
纯粹是 与数据库相关,而blank
与验证相关。如果是一个领域 已blank=True
,表单验证将允许输入空值。 如果字段为blank=False
,则该字段为必填字段。
null
与数据库有关:
如果为True,Django会将空值存储为数据库中的NULL。默认值为False。
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)
不需要字段(表单验证),但需要传入有效的整数值,因为数据库不接受null。通常在这里,您可以使用default=0
为其指定默认值,或者在将值提交给orm之前进行一些验证。
答案 1 :(得分:3)
尝试将None
传递给此字段而不是空字符串''
答案 2 :(得分:0)
您可以在表单类中覆盖“ clean”方法,然后清除整数数据以避免提交空字符串,请参见以下示例:
def clean(self):
self.cleaned_data = super(YourForm, self).clean()
if self.cleaned_data['age'] == '': self.cleaned_data['age'] = None
return self.cleaned_data