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

Django中更新关联ForeignKey与OneToOneKey的对象失败问题

Django一对一关联模型更新失效问题排查与解决

先修正代码里的明显错误

  • 模型类名写错:第二种更新方式里用了get_object_or_404(Machine,pk=request.POST["deveui"]),但你的关联模型是Compteur,类名错误会导致获取的对象完全不对,后续更新自然无效,改成Compteur即可。
  • 字段赋值重复:第一种写法中a.lon_machine = form.cleaned_data["latitude"],把纬度值重复给了经度字段,虽然不影响保存,但会造成数据错误,建议改成对应经度的表单键(比如form.cleaned_data["longitude"])。

验证表单数据是否正确获取

先确认form.cleaned_data里的键名和表单类定义的字段名完全一致,比如"pointservice"、"latitude"是否和表单里的字段名匹配。如果键名错了,赋值的就是空值或原有值,看起来像没更新。可以在赋值前加打印语句验证:

print(form.cleaned_data)  # 查看所有表单数据是否正确

确认实例获取与赋值是否生效

在代码中加入打印,验证拿到的实例和赋值是否正确:

compteur = get_object_or_404(Compteur,pk=request.POST["deveui"])
a = compteur.abonnement
print("更新前point_service:", a.point_service)
a.point_service = form.cleaned_data["pointservice"]
a.lat_machine = form.cleaned_data["latitude"]
a.lon_machine = form.cleaned_data["longitude"]  # 修正这里的键名
print("更新后point_service:", a.point_service)
a.save()

如果打印出更新前后的值有变化,但数据库没更新,再往下排查。

检查模型的save方法与信号

  • 如果Abonnement重写了save()方法,必须调用super().save(*args, **kwargs),否则默认的保存逻辑会被覆盖,导致数据存不进数据库。
  • 检查项目中有没有针对Abonnement的pre_save或post_save信号,这些信号可能会在保存时修改或覆盖你的更新值。

数据库与事务排查

  • 直接用Django shell查询数据库,确认数据是否真的没更新:
from your_app.models import Abonnement, Compteur
compteur = Compteur.objects.get(pk="你的deveui值")
print(Abonnement.objects.get(compteur=compteur).point_service)
  • 如果视图用了@transaction.atomic装饰器,检查是否有异常导致事务回滚。可以临时去掉事务装饰器,或者在a.save()后手动提交事务(仅用于排查):
from django.db import transaction
transaction.commit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:35:20