У меня есть модель, похожая на эту:
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 будет пересчитываться после добавления каждого компонента.
Есть ли другие идеи, как заставить это работать?