почему пустое поле char в Django читается как None, а не как пустая строка? - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть модель, например, такая:

class Item(models.Model):
    text = model.CharField(max_length=50)
    extra_text = model.CharField(max_length=50, blank=True)

Допустим, у меня есть экземпляр объекта, где extra_text пусто, поэтому в базе данных он хранится как пустая строка ''

Я прочитал этот объект, например:

myitem = Item.objects.get(id=1)

Теперь я проверяю, каково значение myitem.extra_text, и оно не '', а None (здесь в оболочке IPython):

In [36]: myitem.extra_text == ''
Out[36]: False

In [37]: myitem.extra_text == None
Out[37]: True

In [38]: myitem.extra_text is None
Out[38]: True

Разве это не должно быть '' на данный момент?Это '' в базе данных, поскольку ему не разрешено быть NULL.

Моя проблема заключается в том, что такой объект не может быть сохранен без изменений обратно в базу данных, потому что, если я попытаюсь, я получу:

In [39]: myitem.save()
<skipping Traceback>
IntegrityError: null value in column "extra_text" violates not-null constraint

Мне очень странно, что экземпляр объекта, который я только что прочитал из базы данных и никак не изменил, не может быть сохранен обратно в базу данных.Я делаю что-то очень неправильно?Как правильно решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2011

Я обнаружил проблему: я использовал django-modeltranslation на этой модели, на этом поле, и я думал, что это влияет только на шаблон, и я думал, что внешние шаблоны item.extra_text все равноотносятся к столбцу extra_text в базе данных.Но похоже, что даже в оболочке она также использует локализованный (на язык по умолчанию) столбец extra_text_en, и этот столбец был равен NULL.

Я обновил поле extra_text во всех строках до '' вбазы данных, и сделал его NOT NULL DEFAULT '', так что теперь, когда я прочитал его в Python, его u''.Но дело в том, что django-modeltranslation по-прежнему хочет сохранить его как NULL в базе данных, что приводит к IntegrityError: null value in column "title_extra_en" violates not-null constraint.

Так что я до сих пор не знаю, как заставить его работать с django-modeltranslation.

0 голосов
/ 22 ноября 2011

Я могу думать только об одном сценарии, где это произойдет:

У вас есть существующая модель с существующими записями в базе данных. Затем вы добавляете новый CharField, но не предоставляете настройки по умолчанию для существующих элементов. Когда вы запрашиваете существующий элемент, это CharField не будет иметь значения, но также не будет иметь значение NULL, и вы получите ошибку целостности.

Если это звучит знакомо, вы сможете исправить это, просто указав значение по умолчанию (даже если это просто '') при добавлении поля.

...