Django - 反序列化对象保留ManyToMany字段
我有一个叫做Goal的模型,还有一个叫做Action的模型。这里我强调一下重要的部分:
class Goal(models.Model):
leaders = models.ManyToManyField(User, null=True)
class Action(models.Model):
before = models.TextField(null=True)
after = models.TextField(null=True)
当用户编辑一个Goal时,我会保存一个新的Action对象。这个Action对象有一个属性叫做before和after。before和after是序列化后的Goal对象。它们稍后会用来记录Goal对象中发生了哪些变化。
其他属性都正常工作(比如标题和描述),但问题出在一个叫做'leaders'的多对多字段上。当我用以下代码反序列化Goal对象时:
before = action.before
for obj in serializers.deserialize("xml", before):
before_object = obj
after = action.after
for obj in serializers.deserialize("xml", after):
after_object = obj
然后尝试访问leaders字段时:
before_object_leaders = before_object.object.leaders.all()
after_object_leaders = after_object.object.leaders.all()
leaders_updated = True
if set(before_object_leaders) == set(after_object_leaders):
leaders_updated = False
before_object_leaders获取的是Goal表中当前的值,而不是我想要的反序列化对象中的值(也就是更新之前的旧值)。
请帮帮我,我快疯了。谢谢!
1 个回答
0
这里的问题是,当你调用 before_object.object.leaders
时,你会得到一个模型管理器,这个管理器在你调用 all()
方法时会自动进行新的数据库查询!这是模型管理器的默认行为。
所以,要解决你的问题,你需要在你的模型对象中写一个新的管理器。这个管理器将负责处理领导者的反序列化。
这里有一些参考资料: