МОДЕЛИ DJANGO, используйте объекты одного класса в другом классе (ManyToManyField) (?) - PullRequest
0 голосов
/ 06 мая 2018

Я хочу использовать один объект класса внутри другого класса.

Чего я хочу достичь: Я уже создал несколько ингредиентов, таких как «курица», «рис» и так далее. Каждый со своими калориями, белками и т. Д. Теперь я хочу создать еду из этих ингредиентов и рассчитать сводку калорий.

Мои цели : 1. Создайте еду: sample_dinner = Meal (name = 'sample_dinner', ing1 = 'курица', ing2 = 'подъем', ing3 = 'помидор') 2. Подсчитайте калории, функцию легко написать, но мне нужно сначала передать аргументы 3. Показать их в поле зрения (я знаю, как)

models.py

class Ingredient(models.Model):
    name = models.CharField(max_length=20,default='')
    calories = models.PositiveIntegerField(default=0)
    proteins = models.PositiveIntegerField(default=0)
    carbs = models.PositiveIntegerField(default=0)
    fat = models.PositiveIntegerField(default=0)

class Meal(models.Model):
    name = models.CharField(max_length=100,default='')
    ingredientone = models.ManyToManyField(Ingredient)

    calories_value = calc_nut_value()

    def calc_nut_value():
        ingr1 = Ingredient.objects.get(name=(f.e 'chicken'))
        ingr2 = Ingredient.objects.get(name=(f.e 'rice'))
        ingr3 = Ingredient.objects.get(name=(f.e 'tomato'))
        calories = ingr1.calories + ingr2.calories + ingr3.calories 
        return calories

1 Ответ

0 голосов
/ 06 мая 2018

Хорошо, поэтому ответ был намного сложнее, чем я сказал. Я действительно извиняюсь за это. Это связано с тем, что отношение 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

Этот код прекрасно работает, если у вас возникнут другие проблемы. Пожалуйста, не стесняйтесь и спросите меня.

...