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

