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

时间:2011-11-30 14:51:19

标签: python django xml-deserialization

我有一个名为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)

当用户编辑目标时,我保存一个新的Action对象。此对象的一个​​属性是之前和之后。前后序列化目标对象。稍后将使用它们来记录Goal对象中的更改内容。

所有属性都可以正常工作(比如标题和描述),当我使用以下命令反序列化目标对象时,问题出现在名为'leaders'的ManyToMany字段中:

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

并尝试使用以下方式访问领导者字段:

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对象的Goal表中的当前值,而不是反序列化对象中的值,这就是我想要的。 (更新前的旧值)

请帮助,我疯了。谢谢!

1 个答案:

答案 0 :(得分:0)

这里的问题是,只要你打电话:before_object.object.leaders,你就会得到一个ModelManager,它会在你调用方法all()时进行新的数据库查询!这就是ModelManager的默认行为。

因此,要解决您的问题,您必须在Model对象中编写一个新的管理器。这位经理将负责领导的反序列化。

这里有一些参考:

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