sql >> Base de Datos >  >> RDS >> Mysql

Cómo almacenar un valor vacío como un campo entero

Una cadena no es un número entero; y una cadena en blanco no es None o NULL . Lo que debe hacer es capturar aquellas instancias en las que el campo está en blanco y luego convertirlo 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 es estrictamente para la validación de front-end; no tiene ningún impacto en el lado de la base de datos:

null por otro lado, tiene que ver con la base de datos:

Un IntegerField requiere un valor que se puede convertir en un número entero, por lo que cuando pasa una cadena en blanco , no puede emitirlo y genera una excepción. En cambio, si pasa None , y tiene age = models.IntegerField(null=True) , sabe almacenarlo correctamente.

Para resumir:

  • age = models.IntegerField()

    El campo es obligatorio y necesita un valor entero válido. No aceptará None y no tendrá valores nulos en la base de datos. Los valores válidos son -2147483648 a 2147483647

  • age = models.IntegerField(null=True)

    El campo es obligatorio (validación de formulario). Si el campo tiene None como valor, se traducirá a NULL en la base de datos.

  • age = models.IntegerField(blank=True, null=True)

    El campo no es obligatorio (validación de formulario). Si el campo se pasa en None , se traducirá a NULL

  • age = models.IntegerField(blank=True)

    El campo no es obligatorio (validación de formulario), pero se debe pasar un valor entero válido porque la base de datos no acepta valores nulos. Por lo general, aquí le daría un valor predeterminado con default=0 o haga alguna validación antes de enviar el valor al orm.