Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker une valeur vide en tant que champ entier

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

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