Доступ к модели djagno до ее создания
Рассмотрим следующую структуру приложения. У вас есть две модели: Recipe и Ingredient, которые связаны друг с другом (очевидно, что каждый рецепт имеет некоторые ингредиенты, и многие ингредиенты могут быть в некоторых рецептах). Обратите внимание, что вы решили использовать M2M (многие ко многим) связь между этими двумя моделями с явной промежуточной моделью -- RecipeIngredient -- которая также содержит одно дополнительное поле с именем amount.
После всего вышесказанного у меня к вам только два вопроса. Как вы сохраните экземпляр рецепта с несколькими ингредиентами через django shell, если экземпляр рецепта все еще не создан. Вы можете считать, что у вас уже есть ингредиенты в вашей БД. И второй, как можно получить доступ к полю amount при создании рецепта?
Если вы запутались, я могу переформулировать вопрос. Как бы вы сохранили рецепт с указанными ингредиентами и их количеством? (Если есть простая модель отношений, которую я могу использовать, пожалуйста, опишите ее).
from django.db import models
from django.contrib.auth import get_user_model
from django.core.validators import MinValueValidator, MaxValueValidator
User = get_user_model()
class Recipe(models.Model):
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='recipies',
verbose_name='Author of a recipe'
)
name = models.CharField(max_length=200, verbose_name='Name of a recipe')
image = models.ImageField()
text = models.TextField(verbose_name='Description of a recipe')
ingredients = models.ManyToManyField(
'Ingredient',
through='RecipeIngredient',
verbose_name='Ingredients of a recipe'
related_name='recipies'
)
cooking_time = models.IntegerField(
validators=[
MinValueValidator(1),
MaxValueValidator(44640)
],
verbose_name='Cooking time in minutes'
)
creation_date = models.DateTimeField(
auto_now=True,
verbose_name='Date of creation'
)
class Ingredient(models.Model):
name = models.CharField(
max_length=256,
verbose_name='Name of an ingredient'
)
measurement_unit = models.CharField(max_length=32)
class RecipeIngredient(models.Model):
recipe = models.ForeignKey(
'Recipe',
on_delete=models.CASCADE
related_name='ingredients'
)
ingredient = models.ForeignKey(
'Ingredient',
on_delete=models.CASCADE
related_name='recipies'
)
amount = models.IntegerField(
validators=[
MinValueValidator(1),
MaxValueValidator(44640)
],
verbose_name='Amount of ingredients'
)
Более формально, у вас есть структура запроса, описанная ниже, где id - это ссылка на существующий ингредиент, а amount - это, как ни банально, количество одного. Как следует сохранять рецепт?
{
"ingredients": [
{
"id": 1123,
"amount": 10
}
],
"name": "string",
"text": "string",
"cooking_time": 1
}