Python 保存前,通过多个多个字段的模型访问多个字段的字段

Python 保存前,通过多个多个字段的模型访问多个字段的字段,python,django,sqlite,Python,Django,Sqlite,我试图将一份食谱的配料成本相加,得出一份食谱的总成本。但是,当我尝试访问“配料”或“配料.对象.过滤器(配方=自我)”的成本时,即使手动保存到super,也不会创建这些对象。但是,我注意到,如果我通过Django管理员两次保存它,则填充“component”对象,并且成本字段可用。那个么,由于我的方法似乎不能正常工作,我该如何总结配方的总成本呢?提前谢谢 class Material(models.Model): UNITS = [ ('kg', 'kg'), ('g', 'gr

我试图将一份食谱的配料成本相加,得出一份食谱的总成本。但是,当我尝试访问“配料”或“配料.对象.过滤器(配方=自我)”的成本时,即使手动保存到super,也不会创建这些对象。但是,我注意到,如果我通过Django管理员两次保存它,则填充“component”对象,并且成本字段可用。那个么,由于我的方法似乎不能正常工作,我该如何总结配方的总成本呢?提前谢谢

class Material(models.Model):
UNITS = [
    ('kg', 'kg'),
    ('g', 'gramm'),
    ('l', 'liter'),
    ('stk', 'Stuck'),
    ('dkg', 'deka'),
]
name = models.CharField(max_length=200)
unit = models.CharField(max_length=20, choices=UNITS, default="kg", verbose_name="Einheit")
lieferant = models.ForeignKey(Lieferant,default=1, verbose_name="Lieferant",on_delete=models.CASCADE, null=True)
costpunit = models.FloatField(verbose_name="Stuckpreis")
menge = models.FloatField(default=1,verbose_name="Menge")
costpkg = models.FloatField(editable=False, verbose_name="Kilopreis") 

class Meta:
    verbose_name_plural = "Materialien"

def __str__(self):
    return self.name

def save(self):
    if self.unit and (self.unit is not "stk"):
        kilogramms = convert_SI(self.menge, self.unit, "kg")


    self.costpkg = self.costpunit/kilogramms
    super(Material, self).save()


class Recipe(models.Model):
name = models.CharField(max_length=200)
cost = models.FloatField(default=1, editable=False, verbose_name="Kosten")
ingredients = models.ManyToManyField(Material, through='Ingredient') 

def __str__(self):
    return self.name 

def save(self):
    x = 0
    super(Recipe, self).save()
    for ing in Ingredient.objects.filter(recipe=self):
        x += ing.cost
    self.cost = x  
    super(Recipe, self).save()


class Ingredient(models.Model):
UNITS = [
    ('kg', 'kg'),
    ('g', 'gramm'),
    ('l', 'liter'),
    ('stk', 'Stuck'),
    ('dkg', 'deka'),
]
material = models.ForeignKey(Material, default=1, verbose_name="Material", on_delete=models.CASCADE, null=True)
recipe = models.ForeignKey(Recipe, default=1, verbose_name="Recipe", on_delete=models.CASCADE, null=True)
menge = models.FloatField(verbose_name="Menge")
unit = models.CharField(max_length=20, choices=UNITS, default="kilo", verbose_name="Einheit")
cost = models.FloatField(default=1, editable=False, verbose_name="Kosten")

def __str__(self):
    return self.recipe.name + ": " + self.material.name 

def save(self):
    if self.unit and (self.unit is not "stk"):
        kilogramms = convert_SI(self.menge, self.unit, "kg")


    self.cost = kilogramms*self.material.costpkg
    super(Ingredient, self).save()

经过进一步调试后,我发现实际问题是django在admin中保存配方的方式,它首先保存配方,然后保存配料,因此解决方案是编辑admin.ModelAdmin for recipe的相关保存方法,它看起来像这样:

class RecipeAdmin(admin.ModelAdmin):
    inlines = (IngredientInlineAdmin,)
    fields = ('name', 'cost')
    readonly_fields = ["cost"]


    def save_related(self, request, form, formsets, change):
       super(RecipeAdmin, self).save_related(request, form, formsets, change)
       # get the recipe from the form
       recip = form.instance
       recip.cost = 0
       # iterate through the saved ingredients
       for ingredient in Ingredient.objects.filter(recipe=recip):
           # populate the cost field of the recipe
           recip.cost += ingredient.cost
       print(recip.cost)
       # and save the recipe again after the ingredients were saved
       recip.save()