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