Django - 反序列化对象保留ManyToMany字段

0 投票
1 回答
580 浏览
提问于 2025-04-17 07:24

我有一个叫做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() 方法时会自动进行新的数据库查询!这是模型管理器的默认行为。

所以,要解决你的问题,你需要在你的模型对象中写一个新的管理器。这个管理器将负责处理领导者的反序列化。

这里有一些参考资料:

https://docs.djangoproject.com/en/dev/topics/db/managers/

撰写回答