Сигнал m2m_changed
несколько странный, так как он вызывается дважды: один раз с действием pre_add
и один раз с действием post_add
(см. документы ).Так как вы вызываете toppings_changed()
для любого действия, оно будет вызвано дважды, следовательно, save()
будет вызвано дважды.
Похоже, вы заинтересованы в post_add
, поэтому я бысделайте что-то вроде:
@receiver(m2m_changed, sender=Pizza.toppings.through)
def toppings_changed(sender, instance, action, **kwargs):
if action == "post_add":
instance.save()
Здесь instance.save()
следует вызывать только один раз, независимо от того, сколько аргументов вы передаете set()
.Обратите внимание, что вам не нужно будет делать m2m_changed.connect(...)
, если вы используете декоратор приемника.
Вышесказанное также относится к pre/post_remove
и pre/post_clear
, поэтому, если вы хотите распечатать свой список после удаления,вам нужно будет добавить еще немного логики, чтобы проверить, если action == "post_remove"
.
Наконец, на всякий случай, если вы не знаете, set([1, 2])
заменит все ваши начинки двумяВы предоставили (pk=1
и pk=2
).Если вы просто хотите добавить начинки к существующему набору, я бы использовал add(1, 2)
.
Надеюсь, это поможет!