How to store empty value as an Integerfield
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 filetry: 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 databasef = MyModel()f.age = valf.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
.null
is purely database-related, whereasblank
is 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
None
and will have no null values in the database. Valid values are -2147483648 to 2147483647age = models.IntegerField(null=True)
Field is required (form validation). If the field has
None
as a value, it will be translated toNULL
in 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=0
or have some validation done before submitting the value to the orm.
You can override 'clean' method in your form class, then cleaning the integer data for avoiding empty string to be submitted, see below example:
def clean(self): self.cleaned_data = super(YourForm, self).clean() if self.cleaned_data['age'] == '': self.cleaned_data['age'] = None return self.cleaned_data