【问题标题】:Django Override Default Save add ManyToManyDjango覆盖默认保存添加ManyToMany
【发布时间】:2016-02-05 06:47:06
【问题描述】:

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

通过 Python 解释器创建一个新航班,保存它,然后运行我在“保存”方法中的循环,将正确的通道添加到多对多关系中。

我在覆盖的保存方法中缺少什么?

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)

这是我测试它的控制台 sn-p:

>>> 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。从管理页面添加时,仍未创建多对多关系。 如果覆盖的 save 方法在 shell 中工作,它不应该在 Django 管理页面上工作吗?

【问题讨论】:

  • 我怀疑虽然您正在向航班添加车道,但实际上您将 number_of_lanes 设置为 0。您可以添加一个带有您正在测试的完整示例的 sn-p 吗?也许这就是错误所在。
  • @Sebastian 即使 number_of_lanes 为 0,他也在添加 +1
  • @Gocht 是的。 range(1,1) 是一个空集。我在循环代码中没有看到错误,这就是我怀疑测试的原因。
  • @Sebastian 他从 1 开始,我没看到。当您确定 number_of_lanes > 0 时尝试测试
  • @Gocht 我已经尝试在范围内使用大于 0 的硬编码值进行测试,但在保存方法期间仍未添加多对多字段。

标签: python django django-models


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2011-12-14
    • 2017-04-26
    • 2014-01-05
    • 2012-03-15
    相关资源
    最近更新 更多