Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar valor vazio como um Integerfield


Uma string não é um inteiro; e uma string em branco não é None ou NULL . O que você precisa fazer é capturar as instâncias em que o campo está em branco e convertê-lo em 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 é estritamente para validação de front-end; não tem nenhum impacto no lado do banco de dados:

null por outro lado, tem a ver com o banco de dados:

Um IntegerField requer um valor que pode ser convertido em um inteiro, então quando você passa uma string em branco , ele não pode convertê-lo e gera uma exceção. Em vez disso, se você passar None , e você tem age = models.IntegerField(null=True) , ele sabe armazená-lo corretamente.

Para resumir:

  • age = models.IntegerField()

    O campo é obrigatório e precisa de um valor inteiro válido. Ele não aceitará None e não terá valores nulos no banco de dados. Os valores válidos são -2147483648 a 2147483647

  • age = models.IntegerField(null=True)

    O campo é obrigatório (validação do formulário). Se o campo tiver None como um valor, ele será traduzido para NULL no banco de dados.

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

    Campo não obrigatório (validação do formulário). Se o campo for passado em None , ele será traduzido para NULL

  • age = models.IntegerField(blank=True)

    O campo não é obrigatório (validação de formulário), mas um valor inteiro válido precisa ser passado porque o banco de dados não aceita nulo. Normalmente aqui você daria um valor padrão com default=0 ou ter alguma validação antes de enviar o valor para o formulário.