Une chaîne n'est pas un entier ; et une chaîne vide n'est pas None
ou NULL
. Ce que vous devez faire est d'attraper les instances où le champ est vide, puis de le convertir en 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
est strictement pour la validation frontale ; cela n'a aucun impact côté base de données :
null
d'autre part, a à voir avec la base de données :
Un IntegerField
nécessite une valeur pouvant être convertie en entier, donc lorsque vous transmettez une chaîne vide , il ne peut pas le lancer et lève une exception. Au lieu de cela, si vous passez None
, et vous avez age = models.IntegerField(null=True)
, il sait le stocker correctement.
Pour résumer :
-
age = models.IntegerField()
Le champ est obligatoire et nécessite une valeur entière valide. Il n'acceptera pas
None
et n'aura aucune valeur nulle dans la base de données. Les valeurs valides sont -2147483648 à 2147483647 -
age = models.IntegerField(null=True)
Le champ est obligatoire (validation du formulaire). Si le champ a
None
en tant que valeur, elle sera traduite enNULL
dans la base de données. -
age = models.IntegerField(blank=True, null=True)
Le champ n'est pas obligatoire (validation du formulaire). Si le champ est passé en
None
, il sera traduit enNULL
-
age = models.IntegerField(blank=True)
Le champ n'est pas obligatoire (validation du formulaire), mais une valeur entière valide doit être transmise car la base de données n'accepte pas les valeurs nulles. Typiquement ici, vous lui donneriez une valeur par défaut avec
default=0
ou faire effectuer une validation avant de soumettre la valeur à l'orm.