web-dev-qa-db-ja.com

Django ModelForm:save(commit = False)は何に使用されますか?

なぜModelFormサブクラスからフォームオブジェクトを作成し、save(commit=False)を実行してフォームとモデルの両方を検証するのではなく、is_valid()を使用するのでしょうか。

言い換えれば、save(commit=False)とは何ですか?

気にしない場合は、これが役立つかもしれない仮説的な状況を提供できますか?

67
sgarza62

モデルデータのほとんどをフォームから取得するときに便利ですが、いくつかのnull=False非フォームデータのフィールド。

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

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

81
dokkaebi

ここに答えがあります( 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()
31
dani herrera

Django docs:

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

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

Save(commit = False)はモデルインスタンスを作成し、それを返します。実際に保存する前のいくつかのポスト処理には適しています!

9
A.J.Rouvoet

「実際の例」として、電子メールアドレスとユーザー名が常に同じであるユーザーモデルを検討し、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を使用してユーザー名を電子メールアドレスに設定しなかった場合、ユーザーモデルの保存方法を変更するか、ユーザーオブジェクトを2回保存する必要があります(高価なデータベース操作を複製します)。

8
Mark Chackerian