我有一个与另一个模型有多对多关系的模型。 我试图在保存时更新多对多关系,但没有添加任何内容。
通过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管理页面上工作吗?
答案 0 :(得分:1)
你应该看看the following article。它基本上描述了当您通过管理表单保存模型时,它不是原子事务。
首先保存主对象,然后清除M2M和新的 值设置为表单中的任何内容。所以,如果你在 save()你所在的主要对象的机会之窗 M2M尚未更新。事实上,如果你尝试做某事 在M2M中,变化将被clear()消除。