DJANGO MODELS,在另一个类中使用一个类对象(ManyToManyField)(?)

时间:2018-05-05 21:29:30

标签: python django python-3.x django-models

我想在另一个类中使用一个类对象。

我想要实现的目标: 我已经创造了一些成分对象,比如鸡肉,大米和#39;等等。 每个人都有自己的卡路里,蛋白质等。 现在我想用这些成分制作一份膳食并计算卡路里总结。

我的目标: 1.创建餐: sample_dinner =用餐(名称=' sample_dinner',ing1 ='鸡肉',ing2 ='上升',ing3 ='番茄') 2.计算卡路里,功能很容易写,但我需要先传递args 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 :(得分:0)

好的,所以答案比我说的要难得多。我真的很抱歉。这是因为ManyToMany relation是在保存方法之外保存的,您无法在覆盖保存方法中计算值,因为我们无法在那里获得成分。我在你的模型上测试了我的代码并且它有效。但是你必须创建signal

每次创建或更改ManyToMany关系时都会调用M2M_changed信号。在此信号中,您可以从ManyToMany关系计算值。您可以通过模型中的参数获得关系。

首先,您必须在signals.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中)。这个配置你必须在settings.py的INSTALLED_APPS中使用,但我认为在较新版本的Django中这是一种标准方式:

from django.apps import AppConfig


class AppNameConfig(AppConfig):
    name = 'appname'

    def ready(self):
        import appname.signals

如果您有任何其他问题,此代码可以正常运行。请不要犹豫,问我。