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

