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

Django ModelForm: для чего используется сохранение (commit = False)?

Зачем мне когда-либо использовать save(commit=False) вместо создания объекта формы из подкласса ModelForm и запускать is_valid() для проверки как формы, так и модели?

Другими словами, что такое save(commit=False) для?

Если вы не возражаете, могли бы вы, ребята, предоставить гипотетические ситуации, когда это может быть полезно?

4b9b3361

Ответ 1

Это полезно, когда вы получаете большую часть своих данных модели из формы, но вам нужно заполнить некоторые поля null=False неформальными данными.

Сохранение с помощью commit = False предоставляет вам объект модели, затем вы можете добавить свои дополнительные данные и сохранить его.

Это хороший пример этой ситуации.

Ответ 2

Вот ответ (из документов):

# Create a form instance with POST data.
>>> f = AuthorForm(request.POST)

# Create, but don't save the new author instance.
>>> new_author = f.save(commit=False)

Наиболее распространенной ситуацией является получение экземпляра из формы, но только "в памяти", а не в базе данных. Перед сохранением вы хотите внести некоторые изменения:

# Modify the author in some way.
>>> new_author.some_field = 'some_value'

# Save the new instance.
>>> new_author.save()

Ответ 3

В документах Django:

Этот метод save() принимает необязательный аргумент ключевого слова commit, который принимает либо True, либо False. Если вы вызываете save() с commit = False, то он вернет объект, который еще не сохранен в базе данных.

В этом случае вам нужно вызвать save() в результирующем экземпляре модели. Это полезно, если вы хотите выполнить пользовательскую обработку объекта перед его сохранением, или если вы хотите использовать одну из специализированных вариантов сохранения модели. commit по умолчанию имеет значение True.

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

Ответ 4

В качестве "реального примера" рассмотрите модель пользователя, в которой адрес электронной почты и имя пользователя всегда совпадают, а затем вы можете перезаписать метод сохранения ModelForm, например:

class UserForm(forms.ModelForm):
    ...
    def save(self):
        # Sets username to email before saving
        user = super(UserForm, self).save(commit=False)
        user.username = user.email
        user.save()
        return user

Если вы не использовали commit=False, чтобы установить имя пользователя на адрес электронной почты, вам придется либо изменить способ сохранения модели пользователя, либо дважды сохранить объект пользователя (что дублирует дорогостоящую операцию базы данных.)