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

Django嵌套序列化器更新时NoneType无add属性及多对多赋值报错如何解决

问题原因
  • 第一个AttributeError: 'NoneType' object has no attribute 'add':访问project.main_photo时返回空值,要么是Project模型中定义的关联字段名称不是main_photo,要么多对多字段的关联管理器未正常初始化。从第二个报错的提示Use photo.set() instead可判断,关联字段实际名称大概率为photo,并非代码中写的main_photo。
  • 第二个TypeError:所用关联字段为多对多(ManyToManyField)类型,Django 禁止直接用=对多对多字段赋值,必须使用官方提供的多对多专属操作方法。
解决方案

先修正代码中的字段名称,再根据业务需求选择对应操作:

方案1:追加关联对象(保留原有关联的前提下新增当前图片)

if main_photos_data.get('id', None):
    MainPhoto.objects.filter(id=main_photos_data.get('id')).update(**main_photos_data)
else:
    id = instance.id
    project = Project.objects.get(id=id)
    new_main_photo = MainPhoto.objects.create(**main_photos_data)
    # 替换为你实际定义的字段名,这里用报错提示的photo为例
    project.photo.add(new_main_photo)
    project.save()

方案2:覆盖关联对象(清空原有关联,仅保留当前图片)

if main_photos_data.get('id', None):
    MainPhoto.objects.filter(id=main_photos_data.get('id')).update(**main_photos_data)
else:
    id = instance.id
    project = Project.objects.get(id=id)
    new_main_photo = MainPhoto.objects.create(**main_photos_data)
    # set方法必须传入可迭代对象,因此要把new_main_photo放到列表中
    project.photo.set([new_main_photo])
    project.save()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:09:00