Ř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
None
a 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
None
jako hodnota bude přeložena naNULL
v 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=0
nebo si před odesláním hodnoty do orm nechejte provést nějaké ověření.