【问题标题】:ManyToManyField aren't available in the post_save signalManyToManyField 在 post_save 信号中不可用
【发布时间】:2013-05-14 09:34:03
【问题描述】:

我需要在保存 Django 模型后操作数据,但我还需要访问 ManyToManyField。

这是我想做的:

class Lab(Model):
  institute = ManyToManyField(Institute)

def post_save_lab(sender, instance, created, *args, **kwargs):
  if not instance.institute.all():
    # Data processing...

post_save.connect(post_save_lab, sender=Lab)

问题是,那个时候 instance.institute.all() 总是空的……我怎么知道实验室有没有研究所?

我指定信号 m2m_changed 不能解决问题,因为如果 ManyToMany 关系中没有元素,则必须完成我的数据处理。因此不会调用 m2m_changed。

谢谢!

【问题讨论】:

  • ForeignKey != ManyToManyField。这是一种不同类型的关系。正如@Hedde 建议的那样,您可能应该使用 m2m-changed 信号
  • 只有在 create Lab 实例或更新时才会看到此行为?
  • 数据处理必须在更新和新对象上进行。
  • 您找到解决方案了吗?

标签: python django signals


【解决方案1】:

在保存模型实例之前,无法保存 m2m。如果您正在寻找 m2m 实例,当对象在后保存信号中创建 created==True 时,它将始终为空。

我认为您可以拥有m2m_changed 信号的处理程序。

【讨论】:

  • 这并不能解决问题,因为如果没有更改m2m,则必须进行数据处理...
【解决方案2】:

您可以覆盖保存方法:

class Lab(Model):
    institute = ManyToManyField(Institute)

    def save(self, *args, **kwargs):
        super(Lab, self).save(*args, **kwargs)
        # ... do something with the many to many
        # example:
        # if self.institute.all().exists():
        #     ...

【讨论】:

  • 那行不通。如果您尝试访问示例中的 institute 管理器,它将返回一个空列表,因为尚未创建关系。
  • @0sh 你确定吗?原始的save 方法首先使用super 调用。它应该使 m2m 可用,就像您在模型类之外保存实例然后添加 m2m 一样
  • 我同意,这是有道理的,但由于here 描述的原因,它不起作用。基本上,m2m 关系在 save 方法之后更新。
猜你喜欢
  • 2016-05-04
  • 2014-12-18
  • 2017-04-06
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2012-10-12
相关资源
最近更新 更多