Сохраняет ли imageField.save () и add () всю модель в django? - PullRequest
0 голосов
/ 08 октября 2018

Я только что почувствовал, что моя model.save() команда была ненужной, потому что, очевидно, это уже было сделано image.save(), а также childs.add()

model = Model()
child = Child()
model.name = 'Test'
model.image.save(file)
model.childs.add(child)
model.save() # is not necessary

Обычно это не должно работать даже сновая запись, потому что функция добавления не будет работать без ПК.Но похоже, что метод image.save() не только переместил / загрузил файл изображения, но и сохранил всю модель в БД.Похоже, то же самое делает childs.add(), потому что эта информация также обновляется без вызова model.save().

Я всегда думал, что обновление базы данных выполняется только при вызове model.save(), очевидно, я ошибся или где моя ошибка?

1 Ответ

0 голосов
/ 08 октября 2018

Это так, как задокументировано.В документах есть даже выделенное предупреждение об этом.

Предупреждение

Два метода этого класса, save () и delete (), по умолчанию сохраняютсяобъект модели связанного FieldFile в базе данных.

По умолчанию FileField.save() (от которого наследуется ImageField) сохранит как файл в хранилище файлов, так и экземпляр модели,Это обеспечивает согласованность состояния базы данных и состояния хранилища файлов.Вы можете переопределить это, используя именованный аргумент save=False в методе FileField.save().

RelatedManager.add() не сохраняет экземпляр вашей модели.Но это обновит отношение в базе данных, которая представлена ​​в другой модели как внешний ключ или в таблице промежуточного соединения.Если у вас есть изменения в других полях в вашем экземпляре, вы должны использовать save(), чтобы сохранить эти изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...