En sträng är inte ett heltal; och en tom sträng är inte None
eller NULL
. Vad du behöver göra är att fånga de fall där fältet är tomt och sedan casta det till 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
är strikt för frontend-validering; det har ingen inverkan på databassidan:
null
å andra sidan har att göra med databasen:
Ett IntegerField
kräver ett värde som kan konverteras till ett heltal, så när du skickar in en tom sträng , den kan inte kasta den och väcker ett undantag. Istället, om du anger None
, och du har age = models.IntegerField(null=True)
, det vet att lagra det korrekt.
För att sammanfatta:
-
age = models.IntegerField()
Fält är obligatoriskt och behöver ett giltigt heltalsvärde. Den accepterar inte
None
och kommer inte att ha några null-värden i databasen. Giltiga värden är -2147483648 till 2147483647 -
age = models.IntegerField(null=True)
Fält är obligatoriskt (formulärvalidering). Om fältet har
None
som ett värde kommer det att översättas tillNULL
i databasen. -
age = models.IntegerField(blank=True, null=True)
Fält krävs inte (formulärvalidering). Om fältet skickas i
None
, kommer den att översättas tillNULL
-
age = models.IntegerField(blank=True)
Fält krävs inte (formulärvalidering), men ett giltigt heltalsvärde måste skickas in eftersom databasen inte accepterar null. Vanligtvis här skulle du ge det ett standardvärde med
default=0
eller få någon validering utförd innan du skickar in värdet till orm.