How to store empty value as an Integerfield

后端 未结 3 2037
一整个雨季
一整个雨季 2020-12-24 02:11

I\'ve seen all the similar threads, read the docs, and tried many combinations to store an empty value as IntegerField in db and failed every single time.

3条回答
  •  一生所求
    2020-12-24 02:56

    A string is not an integer; and a blank string is not None or NULL. What you need to do is catch those instances where the field is blank and then cast it to 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 is strictly for front end validation; it doesn't have any impact on the database side:

    Note that this is different than null. null is purely database-related, whereas blank is validation-related. If a field has blank=True, form validation will allow entry of an empty value. If a field has blank=False, the field will be required.

    null on the other hand, has to do with the database:

    If True, Django will store empty values as NULL in the database. Default is False.

    An IntegerField requires value that can be converted into an integer, so when you pass in a blank string, it cannot cast it and raises an exception. Instead, if you pass in None, and you have age = models.IntegerField(null=True), it knows to store it correctly.

    To summarize:

    • age = models.IntegerField()

      Field is required and needs a valid integer value. It will not accept None and will have no null values in the database. Valid values are -2147483648 to 2147483647

    • age = models.IntegerField(null=True)

      Field is required (form validation). If the field has None as a value, it will be translated to NULL in the database.

    • age = models.IntegerField(blank=True, null=True)

      Field is not required (form validation). If the field is passed in None, it will be translated to NULL

    • age = models.IntegerField(blank=True)

      Field is not required (form validation), but a valid integer value needs to be passed in because the database does not accept null. Typically here you would give it a default value with default=0 or have some validation done before submitting the value to the orm.

提交回复
热议问题