Una stringa non è un numero intero; e una stringa vuota non è None
o NULL
. Quello che devi fare è catturare quelle istanze in cui il campo è vuoto e quindi lanciarlo su 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
è strettamente per la convalida front-end; non ha alcun impatto lato database:
null
d'altra parte, ha a che fare con il database:
Un IntegerField
richiede un valore che può essere convertito in un numero intero, quindi quando si passa una stringa vuota , non può eseguirne il cast e solleva un'eccezione. Invece, se passi None
e hai age = models.IntegerField(null=True)
, sa memorizzarlo correttamente.
Per riassumere:
-
age = models.IntegerField()
Il campo è obbligatorio e richiede un valore intero valido. Non accetterà
None
e non avrà valori nulli nel database. I valori validi sono da -2147483648 a 2147483647 -
age = models.IntegerField(null=True)
Il campo è obbligatorio (convalida del modulo). Se il campo contiene
None
come valore, verrà convertito inNULL
nel database. -
age = models.IntegerField(blank=True, null=True)
Il campo non è obbligatorio (convalida del modulo). Se il campo viene passato in
None
, verrà tradotto inNULL
-
age = models.IntegerField(blank=True)
Il campo non è obbligatorio (convalida del modulo), ma è necessario passare un valore intero valido perché il database non accetta null. In genere qui gli daresti un valore predefinito con
default=0
o fai una convalida prima di inviare il valore all'orm.