【发布时间】:2019-10-17 20:34:13
【问题描述】:
我的项目中有以下模型:
class Topping(models.Model):
name = models.CharField(max_length=255)
class Pizza(models.Model):
name = models.CharField(max_length=255)
toppings = models.ManyToManyField(Topping, blank=True)
def save(self, *args, **kwargs):
print('Saving...')
if self.pk:
for topping in self.toppings.all():
print(topping.name)
super(Pizza, self).save(*args, **kwargs)
def toppings_changed(sender, instance, **kwargs):
instance.save()
m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)
基本上,每当toppings 更改时,都会触发信号。信号所做的只是调用Pizza 对象的保存方法。无论如何,假设我有三个对象:
pizza = Pizza.objects.get(pk=1) # Number of toppings is 0
topping1 = Topping.objects.get(pk=1)
topping2 = Topping.objects.get(pk=2)
现在,我想为我的披萨添加两种配料。我使用以下代码执行此操作:
pizza = Pizza.objects.get(pk=1)
pizza.toppings.set([1, 2])
配料设置正确,但是,披萨的保存方法被调用了两次,因为 m2m_changed 信号被调用了两次,因为发生了两次变化。在提交所有更改后,如何仅调用一次?澄清一下,我希望添加两个浇头,但我只想在所有更改结束时触发一次我的信号。感谢您的帮助。
【问题讨论】:
标签: django django-models many-to-many django-orm