Django ModelForm:什么是save(commit = False)用于?

sga*_*a62 72 django django-models django-forms

为什么我会使用save(commit=False)而不是仅仅从ModelForm子类创建一个表单对象并运行is_valid()来验证表单和模型?

换句话说,是save(commit=False)为了什么?

如果你不介意,你们可以提供假设情况,这可能有用吗?

dok*_*ebi 85

当您从表单中获取大部分模型数据时,这很有用,但需要null=False使用非表单数据填充某些字段.

使用commit = False保存可以获得模型对象,然后您可以添加额外数据并保存.

这是这种情况的一个很好的例子.


dan*_*era 32

这是答案(来自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)
Run Code Online (Sandbox Code Playgroud)

最常见的情况是从表单获取实例,但只在"内存中",而不是在数据库中.在保存之前,您需要进行一些更改:

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

# Save the new instance.
>>> new_author.save()
Run Code Online (Sandbox Code Playgroud)


A.J*_*oet 9

来自Django文档:

此save()方法接受可选的commit关键字参数,该参数接受True或False.如果使用commit = False调用save(),则它将返回尚未保存到数据库的对象.

在这种情况下,您可以在生成的模型实例上调用save().如果要在保存对象之前对对象执行自定义处理,或者如果要使用其中一个专用模型保存选项,则此选项非常有用.默认情况下,commit为True.

似乎save(commit = False)确实创建了一个模型实例,它返回给你.在实际保存之前,对于某些后期处理来说这很整洁!


Mar*_*ian 8

作为一个"真实的例子",考虑一个用户模型,其中电子邮件地址和用户名始终相同,然后您可以覆盖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
Run Code Online (Sandbox Code Playgroud)

如果您没有使用commit=False将用户名设置为电子邮件地址,则必须修改用户模型的保存方法,或者保存用户对象两次(这会复制昂贵的数据库操作.)