109

Why would I ever use save(commit=False) instead of just creating a form object from the ModelForm subclass and running is_valid() to validate both the form and model?

In other words, what is save(commit=False) for?

If you don't mind, could you guys provide hypothetical situations where this might be useful?

4

7 に答える 7

131

これは、ほとんどのモデル データをフォームから取得するときに便利ですが、一部のnull=Falseフィールドにフォーム以外のデータを入力する必要があります。

を使用して保存するとcommit=False、モデル オブジェクトが取得され、追加のデータを追加して保存できます。

これはその状況の良い例です。

于 2012-10-11T21:19:18.393 に答える
47

ここに答えがあります(docs から):

# 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()
于 2012-10-11T21:19:21.373 に答える
18

Django ドキュメントから:

この save() メソッドは、True または False のいずれかを受け入れるオプションの commit キーワード引数を受け入れます。で save() を呼び出すとcommit=False、まだデータベースに保存されていないオブジェクトが返されます。

この場合、結果のモデル インスタンスで save() を呼び出すのはあなた次第です。これは、オブジェクトを保存する前にカスタム処理を行いたい場合や、特殊なモデル保存オプションのいずれかを使用したい場合に便利です。commit はデフォルトで True です。

save( commit=False) はモデル インスタンスを作成し、それを返すようです。実際に保存する前に後処理を行うのに便利です。

于 2012-10-11T21:18:50.267 に答える
10

「実際の例」として、メール アドレスとユーザー名が常に同じユーザー モデルを考えてみましょう。ModelForm の save メソッドを次のように上書きできます。

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、ユーザー モデルの save メソッドを変更するか、ユーザー オブジェクトを 2 回保存する必要があります (これは、コストのかかるデータベース操作を複製します)。

于 2016-06-14T19:27:58.523 に答える