Проблема отношений между многими и многими в моделях Django
Я пишу свое самое первое приложение на django, что-то вроде кулинарной книги. У меня есть проблема с отображения грамматики ингредиента в представлении деталей рецепта (Ingredient и Recipe находятся в отношениях многие-ко-многим через модель IngredientRecipe). Вот мои модели:
class Ingredient(models.Model):
name = models.CharField(max_length=50, unique=True)
glycemic_index = models.IntegerField(choices=GLYCEMIC_INDEX)
class Recipe(models.Model):
title = models.CharField(max_length=50)
cooking_time = models.IntegerField()
difficulty_level = models.IntegerField(choices=DIFFICULTY_LEVELS, default=1)
description = models.TextField()
created = models.DateTimeField(auto_now_add=True)
cuisine = models.ForeignKey('Cuisine', on_delete=models.CASCADE, null=True)
ingredient = models.ManyToManyField(Ingredient, through='IngredientRecipe')
class IngredientRecipe(models.Model):
ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
**grammage = models.IntegerField(help_text='in grams')**
Вот вид:
class RecipeDetailsView(View):
def get(self, request, id):
recipe = Recipe.objects.get(id=id)
ingredients = recipe.ingredient.all()
return render(request, 'recipe_details.html', {'recipe': recipe, 'ingredients': ingredients})
Дело в том, что сейчас мое представление показывает ингредиенты рецепта без их грамматики (поле грамматики в модели many to many). Я не знаю, как это сделать в коде представления. Пробовал несколько разных способов, но ничего не получается.
Любые идеи, как это решить, очень приветствуются.
Прошу прощения за ошибки, это мое первое сообщение здесь :)
Вы можете попробовать не использовать through и вместо этого направить ваше поле ingredient manytomany к вашей модели IngredientRecipe. Таким образом, Recipe.ingredient получит доступ к вашей модели IngredientRecipe и у вас будет грамматика.
Если вам также нужно, чтобы ваше представление возвращало название ингредиента, вы можете изменить метод __str()__ в вашей IngredientRecipe модели.
Вот пример того, как это можно сделать:
class Recipe(models.Model):
title = models.CharField(max_length=50)
cooking_time = models.IntegerField()
difficulty_level = models.IntegerField(choices=DIFFICULTY_LEVELS, default=1)
description = models.TextField()
created = models.DateTimeField(auto_now_add=True)
cuisine = models.ForeignKey('Cuisine', on_delete=models.CASCADE, null=True)
ingredient = models.ManyToManyField(IngredientRecipe)
class IngredientRecipe(models.Model):
ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
grammage = models.IntegerField(help_text='in grams')
def __str__(self):
return "CHANGE THIS STRING TO SHOW WHAT YOU WANT TO GET FROM RENDERING THE INGREDIENT FIELD."