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)
来自Django文档:
此save()方法接受可选的commit关键字参数,该参数接受True或False.如果使用commit = False调用save(),则它将返回尚未保存到数据库的对象.
在这种情况下,您可以在生成的模型实例上调用save().如果要在保存对象之前对对象执行自定义处理,或者如果要使用其中一个专用模型保存选项,则此选项非常有用.默认情况下,commit为True.
似乎save(commit = False)确实创建了一个模型实例,它返回给你.在实际保存之前,对于某些后期处理来说这很整洁!
作为一个"真实的例子",考虑一个用户模型,其中电子邮件地址和用户名始终相同,然后您可以覆盖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将用户名设置为电子邮件地址,则必须修改用户模型的保存方法,或者保存用户对象两次(这会复制昂贵的数据库操作.)
| 归档时间: |
|
| 查看次数: |
48552 次 |
| 最近记录: |