Łańcuch nie jest liczbą całkowitą; a pusty ciąg nie jest None
lub NULL
. Musisz złapać te instancje, w których pole jest puste, a następnie rzutować je 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
służy wyłącznie do sprawdzania poprawności front-endu; nie ma to żadnego wpływu na stronę bazy danych:
null
z drugiej strony ma do czynienia z bazą danych:
IntegerField
wymaga wartości, którą można przekonwertować na liczbę całkowitą, więc gdy przekazujesz pusty ciąg , nie może go rzutować i zgłasza wyjątek. Zamiast tego, jeśli zdasz None
, i masz age = models.IntegerField(null=True)
, wie, jak prawidłowo go przechowywać.
Podsumowując:
-
age = models.IntegerField()
Pole jest wymagane i wymaga prawidłowej liczby całkowitej. Nie zaakceptuje
None
i nie będzie zawierał wartości null w bazie danych. Prawidłowe wartości to od -2147483648 do 2147483647 -
age = models.IntegerField(null=True)
Pole jest wymagane (walidacja formularza). Jeśli pole zawiera
None
jako wartość zostanie przetłumaczona naNULL
w bazie danych. -
age = models.IntegerField(blank=True, null=True)
Pole nie jest wymagane (walidacja formularza). Jeśli pole jest przekazywane w
None
, zostanie przetłumaczony naNULL
-
age = models.IntegerField(blank=True)
Pole nie jest wymagane (walidacja formularza), ale należy podać prawidłową liczbę całkowitą, ponieważ baza danych nie akceptuje wartości null. Zazwyczaj tutaj podajesz mu domyślną wartość z
default=0
lub zlecić weryfikację przed przesłaniem wartości do formularza.