Подтвердить что ты не робот

Как сохранить пустое значение как Integerfield

Я видел все похожие потоки, читал документы и пытался использовать множество комбинаций для хранения пустого значения IntegerField в db и не выполнялся каждый раз.

Я использую MySQL.

My models.py определяет поле age=models.IntegerField(). Я заполняю db из файла csv, а некоторые ячейки не имеют значения. Django docs говорит:

Field.null

If True, Django will store empty values as NULL in the database. Default is False.
Note that empty string values will always get stored as empty strings, not as NULL. 

Поскольку я работаю с IntegerField, я хочу, чтобы пустая строка (пустая ячейка из csv) хранилась как NULL в db. Поэтому я (думаю) должен добавить null=True в поле age. На самом деле, я пробовал больше, чем это:

age=models.IntegerField()
age=models.IntegerField(null=True)
age=models.IntegerField(null=True, blank=True)
age=models.IntegerField(null=True, blank=True, default=None)

и каждый раз, когда я вставляю пустую строку в db, я получил

ValueError: invalid literal for int() with base 10: ''

Можно догадаться, что еще я могу сделать?

4b9b3361

Ответ 1

Строка не является целым числом; и пустая строка не None или NULL. Что вам нужно сделать, это поймать те экземпляры, где поле пусто, а затем применить его к 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 строго для проверки переднего конца; это не влияет на сторону базы данных:

Обратите внимание, что это отличается от NULL. NULL чисто связанный с базой данных, тогда как blank связан с валидацией. Если поле имеет blank=True, проверка формы позволит ввести пустое значение. Если поле имеет blank=False, это поле будет необходимо.

NULL, с другой стороны, связано с базой данных:

Если True, Django будет хранить пустые значения как NULL в базе данных. По умолчанию False.

An IntegerField требует значения, которое может быть преобразовано в целое число, поэтому, когда вы передаете пустую строку, она не может использовать ее и вызывает исключение. Вместо этого, если вы пройдете в None, и у вас есть age = models.IntegerField(null=True), он знает, что нужно хранить его правильно.

Подводя итог:

  • age = models.IntegerField()

    Поле требуется и требует действительного целочисленного значения. Он не примет None и не будет иметь нулевых значений в базе данных. Допустимые значения: от -2147483648 до 2147483647

  • age = models.IntegerField(null=True)

    Поле обязательное (проверка формы). Если поле имеет None в качестве значения, оно будет переведено в NULL в базе данных.

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

    Поле не требуется (проверка формы). Если поле передано в None, оно будет переведено на NULL

  • age = models.IntegerField(blank=True)

    Поле не требуется (проверка формы), но допустимое целочисленное значение необходимо передать, поскольку база данных не принимает значение null. Обычно здесь вы указываете значение по умолчанию с помощью default=0 или выполняете некоторую проверку перед отправкой значения в orm.

Ответ 2

Попробуйте передать None в это поле непустую строку ''