Django. Получение данных из модели в форму
Совсем недавно начал изучать django и столкнулся с такой проблемой. Есть модель, которая хранит рецепт, который состоит из списка ингредиентов и их процентном соотношении:
class Recipe(models.Model):
recipe_name = models.CharField(max_length=200, verbose_name='Название рецепта')
mass = models.FloatField(default=0, verbose_name='Общая масса')
category = models.ForeignKey(Category, on_delete=models.CASCADE, default=0)
def save(self, *args, **kwargs):
ings = self.ingredient_set.all()
for ing in ings:
ing.concentration = ing.mass / self.mass
ing.save()
return super(Recipe, self).save(*args, **kwargs)
def __str__(self):
return self.recipe_name
Модель ингредиента:
class Ingredient(models.Model):
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
ingredient = models.CharField(max_length=200, verbose_name='Ингредиент')
mass = models.FloatField(default=0)
concentration = models.FloatField(default=-1)
def __str__(self):
return self.ingredient
def save(self, *args, **kwargs):
if not self.pk:
self.recipe.mass += self.mass
self.recipe.save()
else:
prev_mass = Ingredient.objects.get(pk=self.pk).mass
if prev_mass != self.mass:
self.recipe.mass += self.mass - prev_mass
self.recipe.save()
self.concentration = (self.mass / self.recipe.mass) * 100
return super(Ingredient, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
self.recipe.mass -= self.mass
self.recipe.save()
return super(Ingredient, self).delete(*args, **kwargs)
Сделал форму, которая при вводе числа - размера партии, должна выводить рецепт для необходимого объема партии. Сложности появились с передачей списка ингредиентов в функцию:
def batch(request, pk):
recipe_id = Recipe.objects.get(pk=pk)
recipe = Recipe.ingredient_set.all()
if request.method == 'POST':
form = RecipeBatchForm(request.POST)
if form.is_valid():
batch = recipe.ingredient.concentration/100*batch_size
return batch
else:
form = RecipeBatchForm()
return render(request, 'recipes/recipe_batch.html', {'form': form, 'batch': batch, 'batch_size': batch_size, 'recipe_id': recipe_id})
Ошибка - AttributeError at /recipes/1/batch 'ReverseManyToOneDescriptor' object has no attribute 'all'
Эта конструкция Recipe.ingredient_set.all()
прекрасно работает при выводе рецепта в шаблоне, а тут почему-то нет.