You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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才会生成对应的UPDATE SQL语句,把更新后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:03:46