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

Django数据未写入数据库但打印语句正常问题排查

Django对象属性修改后数据库未更新问题

使用Django作为Web框架实现体重记录功能时,发现修改macro_day对象的weight属性后,控制台打印显示属性已更新,但数据库中该字段并未改变。其他类似功能的函数无此问题,求排查错误。


相关代码

视图处理函数

def addWeight(request):
    if request.method == "GET":
        form = weightForm()
        return render(request, "base/weight.html", {"form": form})
    if request.method == "POST":
        try:
            form = weightForm(request.POST)
            if not form.is_valid():
                return HttpResponseBadRequest("Error with your form")
            data = form.cleaned_data
            day = macro_day.objects.get_or_create(owner=request.user, date=data["date"])
            print(data["weight"])
            day[0].weight = data["weight"]
            print(day[0])
            print(day[0].weight)
            return HttpResponse(status=204)

前端表单代码

<form action="weight" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="SUBMIT">
</form>

表单类定义

class weightForm(forms.Form):
    date = forms.DateField(label="Date")
    weight = forms.IntegerField(label="Weight", min_value=0, max_value=500)

问题原因与解决方案

问题根源

你修改day[0].weight属性后,仅在内存中更新了对象的值,但没有调用Django ORM的save()方法将变更持久化到数据库。Django模型对象的内存属性修改不会自动同步到数据库,必须显式调用save()完成写入。

修复后的代码

在修改weight属性后添加save()调用:

def addWeight(request):
    if request.method == "GET":
        form = weightForm()
        return render(request, "base/weight.html", {"form": form})
    if request.method == "POST":
        try:
            form = weightForm(request.POST)
            if not form.is_valid():
                return HttpResponseBadRequest("Error with your form")
            data = form.cleaned_data
            day = macro_day.objects.get_or_create(owner=request.user, date=data["date"])
            print(data["weight"])
            day[0].weight = data["weight"]
            day[0].save()  # 新增该行,将内存中的变更写入数据库
            print(day[0])
            print(day[0].weight)
            return HttpResponse(status=204)
        except Exception as e:
            # 建议补充异常捕获,避免未处理错误导致服务异常
            return HttpResponseBadRequest(f"Server error: {str(e)}")

补充说明

  • get_or_create()返回元组(模型实例, 是否新建),day[0]即为操作的macro_day对象;
  • 其他类似功能函数正常,大概率是那些函数中包含了save()调用,而此函数遗漏了这一步。

内容的提问来源于stack exchange,提问作者darkrai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:16:11