Как Django поддерживает согласованность между своими логическими ограничениями и базой данных? - PullRequest
0 голосов
/ 10 ноября 2018

Допустим, у меня есть модель, определенная следующим образом:

class Foo(models.Model):
    bar = models.CharField(max_length=10)

Используя эту модель, я создаю объект Foo в своей базе данных, используя следующий код:

Foo.objects.create(bar="0123456789")

Должно работать достаточно хорошо. Однако после создания объекта я уменьшил свойство max_length до 5. Так что теперь, технически, у созданного мной объекта есть ошибка согласованности.

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

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Это зависит от конкретного свойства поля. В случае max_length он используется в несколько этапов проверки в дополнение к самой базе данных.

HTML-виджет по умолчанию будет вставлять атрибут maxlength в элемент формы <input>. А на стороне сервера Form.clean() также проверит длину любых полей символов.

Наконец, база данных выдаст ошибку (если вы создали и применили новую миграцию после изменения поля). Но конкретное поведение здесь зависит от базы данных.

Проверка на стороне клиента - это просто удобство использования. Все данные, поступающие от клиента, также должны быть проверены на сервере, так как проверка на стороне клиента может быть обойдена злоумышленником или отключена или недоступна на некоторых клиентах.

Проверка Django - это то, что вы используете большую часть времени. В него встроена обработка ошибок и ответы http, если вы используете фреймворк / приложение, такое как django формы, django admin или django rest framework.

Проверка базы данных является резервной, когда вы вставляете некоторые недействительные данные, даже если это "не должно быть возможным" Ошибки здесь могут привести к неперехваченному исключению, и вся транзакция будет откатана. Это очень полезная сеть безопасности, когда в вашем приложении django есть ошибки.

0 голосов
/ 10 ноября 2018

Джанго ничего не сделает в описанной вами ситуации. Однако, если вы запустите makemigrations, он сгенерирует миграцию базы данных, которая изменит столбец db на 5 символов; выполнение этого приведет к усечению существующих значений.

...