M2M 信号在直通场上发生变化
Signal for M2M changed on a through field
在将我的 M2M 字段切换到直通字段之前,我收到了这个信号,它会调用实例上的方法来更新它的一些值。但是我切换到 'through' 类型的 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)
我觉得以前没有弄清楚这一点很愚蠢。在直通模型上使用 post_save
和 post_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()
在将我的 M2M 字段切换到直通字段之前,我收到了这个信号,它会调用实例上的方法来更新它的一些值。但是我切换到 'through' 类型的 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)
我觉得以前没有弄清楚这一点很愚蠢。在直通模型上使用 post_save
和 post_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()