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


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

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

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

4 53

4 ответа:

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

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

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

вот он ответ (идее):

# 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()

из документов Django:

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

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

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

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

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 чтобы установить имя пользователя на адрес электронной почты, вам придется либо изменить метод сохранения модели пользователя, либо сохранить объект пользователя дважды (что дублирует дорогостоящую операцию с базой данных.)