Django: не выдает ошибку, если CharField и TextField не предоставлены - PullRequest
0 голосов
/ 05 октября 2019

В полях модели Django по умолчанию blank=False и null=False

class Test(models.Model):
    name = models.CharField()

Теперь я пытаюсь сохранить тест без указания имени

Test.objects.create(pk=1)

Теперь я ожидаю, что он должен поднятьисключение "null value in column "name" violates not-null constraint" о том, что имя обязательно. Принимая во внимание, что для других полей это вызовет исключение, что мы должны предоставить значение

Так что это некоторое поведение по умолчанию для CharField и TextField, которое позволит хранить пустую строку независимо от пробела и нуля, если мы попытаемся сохранитьмодель напрямую, без каких-либо форм.

1 Ответ

0 голосов
/ 05 октября 2019

Что-то еще не так.

CharField - это , необходимый для определения атрибута 'max_length'. Test не должен был пройти за makemigrations, но в одиночку добраться до стадии создания объектов. Вы не забыли запустить миграцию? Я столкнулся с этой ошибкой, проверяя это.

Вот необработанный SQL-запрос, который выполняет Django (при условии, что вы добавляете max_length и makemigrations):

'INSERT INTO "polls_test" ("id", "name") SELECT 4, \'\'', 'time': '0.007'

Очевидно, Django берет на себя, чтобы просто установитьимя пустым, если вы намеренно создаете его с помощью .create().

Одна вещь, которую я обнаружил, заключается в том, что Django специально хочет, чтобы null избегали в CharField и TextField , вместо этого вместо пустогострока является пустым значениемЭто, вероятно, побочный эффект этого решения.

...