Ł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
Nonei 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
Nonejako wartość zostanie przetłumaczona naNULLw 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=0lub zlecić weryfikację przed przesłaniem wartości do formularza.