【问题标题】:Signal for M2M changed on a through fieldM2M 的信号在直通场上发生变化
【发布时间】:2015-09-04 10:33:13
【问题描述】:

在将我的 M2M 字段切换到直通字段之前,我有这个信号,它会调用实例上的方法来更新它的一些值。但我切换到“通过”类型的 M2M,它停止了运行。我可以通过在我的序列化程序中调用这些函数来解决这个问题,但这有点讨厌。我该如何解决?

信号

@receiver(m2m_changed, sender=Order.items.through)
def update_order_when_items_changed(sender, instance, **kwargs):
    instance.set_weight()
    instance.set_total_price()
    instance.save()

当前模型

class OrderItem(models.Model):
    order = models.ForeignKey('main.Order')
    item = models.ForeignKey('main.Item')
    quantity = models.IntegerField(default=1)


class Order(models.Model):
    user = models.ForeignKey("main.ShopUser")
    items = models.ManyToManyField("main.Item", through='main.OrderItem')
    placed = models.BooleanField(default=False)
    date_placed = models.DateTimeField(null=True, blank=True)

【问题讨论】:

  • .items.through 仅在Order实例上可用
  • order.items 只是一个没有through 模型的M2M 字段时,这是可行的
  • 嗯。那很有意思。我必须设置它,看看它是如何工作的。

标签: django many-to-many has-many-through django-signals


【解决方案1】:

我觉得以前没有弄清楚这一点很愚蠢。在直通模型上使用 post_savepost_delete 而不是 m2m_changed 信号,它应该基本上做同样的事情。然后在我的序列化程序中,如果我没有进行其他更改,只需删除 instance.save()

@receiver((post_save, post_delete), sender="main.OrderItem")
def update_order_when_items_changed(sender, instance, **kwargs):
    instance.order.set_weight()
    instance.order.set_total_price()
    instance.order.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多