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
相关产品推荐
相关产品推荐

