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, 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 2147483647 -
age = 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.
- [Django]-Returning pure Django form errors in JSON
- [Django]-Django using get_user_model vs settings.AUTH_USER_MODEL
- [Django]-Import error 'force_text' from 'django.utils.encoding'
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
- [Django]-Django 1.9 deprecation warnings app_label
- [Django]-Django dump data for a single model?
- [Django]-What does "'tests' module incorrectly imported" mean?