Хорошо, поэтому ответ был намного сложнее, чем я сказал. Я действительно извиняюсь за это. Это связано с тем, что отношение ManyToMany сохраняется вне метода сохранения, и вы не можете вычислить значение в переопределенном методе сохранения, потому что мы не можем получить ингредиенты там. Я проверил мой код на вашей модели, и он работает. Но вы должны создать сигнал .
Сигнал M2M_changed вызывается при каждом создании или изменении отношения ManyToMany. В этом сигнале вы можете вычислить значения из отношения ManyToMany. Вы можете получить отношение через параметр из вашей модели.
Сначала вы должны создать сигнал в файле signal.py:
from .models import Meal
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
@receiver(m2m_changed, sender=Meal.ingredientone.through)
def calc_calories(sender, instance, action, **kwargs):
# you can get all ingredients for meal
ingrs = instance.ingredientone.all()
# iterate over ingredients
calories = 0
for ingr in ingrs:
calories += ingr.calories
instance.calories_value = calories
instance.save()
Затем вы должны импортировать ваши сигналы в apps.py (в AppConfig). Этот конфиг вы должны использовать в INSTALLED_APPS в settings.py, но я думаю, что в более новой версии Django это стандартный способ:
from django.apps import AppConfig
class AppNameConfig(AppConfig):
name = 'appname'
def ready(self):
import appname.signals
Этот код прекрасно работает, если у вас возникнут другие проблемы. Пожалуйста, не стесняйтесь и спросите меня.