Проблема отношений между многими и многими в моделях 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."
Вернуться на верх