A string is not an integer; and a blank string is not None or NULL. What you need to do is catch those instances where the field is blank and then cast it to 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 is strictly for front end validation; it doesn’t have any impact on the database side:
Note that this is different than
null.nullis purely
database-related, whereasblankis validation-related. If a field
hasblank=True, form validation will allow entry of an empty value.
If a field hasblank=False, the field will be required.
null on the other hand, has to do with the database:
If True, Django will store empty values as NULL in the database. Default is False.
An IntegerField requires value that can be converted into an integer, so when you pass in a blank string, it cannot cast it and raises an exception. Instead, if you pass in None, and you have age = models.IntegerField(null=True), it knows to store it correctly.
To summarize:
-
age = models.IntegerField()Field is required and needs a valid integer value. It will not accept
Noneand will have no null values in the database. Valid values are -2147483648 to 2147483647 -
age = models.IntegerField(null=True)Field is required (form validation). If the field has
Noneas a value, it will be translated toNULLin the database. -
age = models.IntegerField(blank=True, null=True)Field is not required (form validation). If the field is passed in
None, it will be translated toNULL -
age = models.IntegerField(blank=True)Field is not required (form validation), but a valid integer value needs to be passed in because the database does not accept null. Typically here you would give it a default value with
default=0or have some validation done before submitting the value to the orm.