我想在另一个类中使用一个类对象。
我想要实现的目标: 我已经创造了一些成分对象,比如鸡肉,大米和#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
答案 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
如果您有任何其他问题,此代码可以正常运行。请不要犹豫,问我。