Django中save()方法的作用是什么?附投票功能代码示例
Django中Model.save()方法的作用解析
你的问题与代码
你正在学习Django,编写了投票功能的代码:
def vote(request, question_id): question = get_object_or_404(Question, pk=question_id) try: selected_choice = question.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): # 重新显示问题投票表单 return render(request, 'polls/detail.html', { 'question':question, 'error_message':"You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('po...
想请教Django中的save()方法具体有什么作用?
save()方法的核心作用
嘿,我来给你详细拆解这个方法的作用,结合你写的投票代码来看会更清楚:
持久化内存中的修改:你代码里
selected_choice.votes += 1只是在内存里修改了这个Choice实例的投票数字段,并没有真正写到数据库里。只有调用save()后,Django才会生成对应的UPDATESQL语句,把更新后的votes值写入数据库的对应行。如果跳过这一步,刷新页面后你会发现投票数根本没变化——因为内存里的修改会随着请求结束被丢弃。兼容新增与更新场景:
save()会自动判断当前实例的状态:- 如果是新创建的实例(比如你用
Choice(question=my_question, choice_text="选项A")生成的),save()会执行INSERT语句,把新数据插入到数据库表中; - 如果是像你代码里那样从数据库查询出来的实例,
save()会执行UPDATE语句,默认只更新你修改过的字段(也可以通过参数控制全量更新)。
- 如果是新创建的实例(比如你用
触发模型生命周期钩子:调用
save()时,Django会自动触发一系列内置的信号和方法,比如pre_save、post_save信号,还有模型类中你自定义的clean()、save()(如果你重写了的话)。这些钩子可以用来做额外逻辑,比如在保存前验证数据格式、自动填充创建时间字段、保存后发送通知等。维护数据库约束与关系:Django会帮你处理数据库层面的规则,比如外键关联的合法性、唯一字段的唯一性等。调用
save()时,它会确保你的数据符合这些约束,如果不符合会抛出对应的异常(比如外键不存在的话会直接报错)。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

