[Django]-How to store empty value as an Integerfield

59πŸ‘

βœ…

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. null is purely
database-related, whereas blank is validation-related. If a field
has blank=True, form validation will allow entry of an empty value.
If a field has blank=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 2147483647

  • age = models.IntegerField(null=True)

    Field is required (form validation). If the field has None as a value, it will be translated to NULL 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 to NULL

  • 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.

πŸ‘€Burhan Khalid

4πŸ‘

Try to pass None to this field not empty string ”

πŸ‘€ndpu

0πŸ‘

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
πŸ‘€Simon Chen

Leave a comment