Django m2m_change сигнал с дополнительной моделью - PullRequest
0 голосов
/ 25 июня 2018

У меня есть модель, похожая на эту:

class Recipe(models.Model):
    name = models.CharField(_('Name'))
    components = models.ManyToManyField(RecipeComponent, through='alchemy.RecipeComposition')
    total_weight = models.FloatField(_('How much recipe will weight'))

class RecipeComponent(models.Model):
    name = models.CharField(_('Name'))

class RecipeComposition(models.Model):
    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
    component = models.ForeignKey(RecipeComponent, on_delete=models.CASCADE)
    number = models.FloatField(_('Defines how much of the component you need'), default=1)

Я должен выполнить некоторые вычисления (например, общий вес) рецепта после любых обновлений в RecipeComposition.

Попытка сделать это, к сожалению, не помогает:

@receiver(m2m_changed, sender=Recipe.components.through, weak=False)
def recipe_components_changed(sender, **kwargs):
    print("meow >^-_-^<")
    # some calculations for recipe.total_weight here

Найден вопрос с той же проблемой, но он старый (3 года назад) и не имеет правильного ответа. Там есть ссылка на тикет 17688 , который открыт 6 лет назад, но до сих пор не решен.

Я не хочу использовать post_save так:

@receiver(post_save, sender=RecipeComposition)

потому что в этом случае при создании нового рецепта total_weight будет пересчитываться после добавления каждого компонента.

Есть ли другие идеи, как заставить это работать?

...