2011-11-30 96 views
0

我有一个名为Goal的模型,另一个名为Action。这里我强调一下重要的部分:Django - 反序列化保存ManyToMany字段的对象

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对象。此Action对象的属性之一是之前和之后。之前和之后都是序列化的目标对象。他们稍后将用于记录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 

,并尝试与访问领导人场:

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获取目标表为目标对象的当前值,而不是在反序列化对象,这就是我想要的价值。 (旧值,更新前)

请帮忙,我疯了。谢谢!

回答

0

这里的问题是,只要你打电话给:before_object.object.leaders你会得到一个ModelManager,当你调用方法all()时,将会产生新的DB查询!那就是ModelManager的默认行为。

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

这里是一些参考:

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

+0

嘿,非常感谢亚瑟!你的评论让我意识到了这个问题,我是Django的新手,所以我不知道leaders.all()实际上是再次查询数据库。 :) – thyagx