Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare un valore vuoto come campo intero

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 in NULL 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 in NULL

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