Django覆盖默认保存添加ManyToMany

时间:2015-11-04 16:53:52

标签: python django django-models

我有一个与另一个模型有多对多关系的模型。 我试图在保存时更新多对多关系,但没有添加任何内容。

通过Python Interpreter创建一个新的Flight,保存它,然后运行我在' save'方法将正确的通道添加到多对多关系中。

重写的保存方法中缺少什么?

class Flight(models.Model):
    number_of_lanes = models.PositiveSmallIntegerField()
    start_time = models.TimeField()
    lanes = models.ManyToManyField(Lane, blank=True)
    tournament = models.ForeignKey('Tournament')

    def __unicode__(self):
        return u'Lanes: %s | Start: %s' % (self.number_of_lanes, self.start_time)

    def save(self, *args, **kwargs):
        super(Flight, self).save(*args, **kwargs)

        for i in range(1, self.number_of_lanes+1):
            lane = Lane.objects.get(id=i)
            self.lanes.add(lane)

以下是我测试它的控制台代码段:

>>> flight = Flight()
>>> flight.number_of_lanes=5
>>> flight.start_time='8:30'
>>> flight.tournament=t
>>> flight.save()
>>> flight.lanes.all()
[<Lane: 1>, <Lane: 2>, <Lane: 3>, <Lane: 4>, <Lane: 5>]

编辑: 关于我在哪里的简要更新。

save方法在控制台中运行。我第一次测试它,我忘了重新加载Django shell。从管理页面添加时,仍然没有创建多对多关系。 如果覆盖的保存方法在shell中有效,那么它不应该在Django管理页面上工作吗?

1 个答案:

答案 0 :(得分:1)

你应该看看the following article。它基本上描述了当您通过管理表单保存模型时,它不是原子事务。

  

首先保存主对象,然后清除M2M和新的   值设置为表单中的任何内容。所以,如果你在   save()你所在的主要对象的机会之窗   M2M尚未更新。事实上,如果你尝试做某事   在M2M中,变化将被clear()消除。