Řetězec není celé číslo; a prázdný řetězec není None nebo NULL . Co musíte udělat, je zachytit ty případy, kdy je pole prázdné, a poté je přenést na 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
je výhradně pro ověření frontendu; nemá to žádný dopad na stranu databáze:
null
na druhou stranu má co do činění s databází:
IntegerField vyžaduje hodnotu, kterou lze převést na celé číslo, takže když předáte prázdný řetězec , nemůže jej přenést a vyvolá výjimku. Místo toho, pokud předáte None a máte age = models.IntegerField(null=True) , ví to správně uložit.
Abych to shrnul:
-
age = models.IntegerField()Pole je povinné a potřebuje platnou celočíselnou hodnotu. Nepřijme
Nonea nebude mít v databázi žádné hodnoty null. Platné hodnoty jsou -2147483648 až 2147483647 -
age = models.IntegerField(null=True)Pole je povinné (ověření formuláře). Pokud má pole
Nonejako hodnota bude přeložena naNULLv databázi. -
age = models.IntegerField(blank=True, null=True)Pole není povinné (ověření formuláře). Pokud je pole předáno v
None, bude přeložen naNULL -
age = models.IntegerField(blank=True)Pole není povinné (ověření formuláře), ale je třeba zadat platnou celočíselnou hodnotu, protože databáze nepřijímá hodnotu null. Zde byste mu obvykle dali výchozí hodnotu s
default=0nebo si před odesláním hodnoty do orm nechejte provést nějaké ověření.